SICStus Prolog 4:将整数从Prolog传递到C

SICStus Prolog 4:将整数从Prolog传递到C,c,prolog,ffi,sicstus-prolog,C,Prolog,Ffi,Sicstus Prolog,在学习SICStus Prolog 4 FFI到C的过程中,我有一个关于中示例谓词c1/2的具体问题 ex.pl包括以下行: foreign(c1, c, c1(+integer, [-integer])). ex.c包含以下代码段: /* c1(+integer, [-integer]) */ SP_integer c1(a) SP_integer a; { return(a+9); } 这适用于小整数: | ?- c1(100,X). X = 109 ? ye

在学习SICStus Prolog 4 FFI到C的过程中,我有一个关于中示例谓词c1/2的具体问题

ex.pl包括以下行:

 foreign(c1,  c, c1(+integer, [-integer])).
ex.c包含以下代码段:

 /* c1(+integer, [-integer]) */
 SP_integer c1(a)
 SP_integer a;
 {
    return(a+9);
 }
这适用于小整数:

 | ?- c1(100,X).
 X = 109 ?
 yes
 | ?- c1(100000000000000,X).
 X = 100000000000009 ?
 yes
 | ?- c1(10000000000000000000000000,X).
 X = 1590897978359414793 ? 
 yes
它不适用于大整数:

 | ?- c1(100,X).
 X = 109 ?
 yes
 | ?- c1(100000000000000,X).
 X = 100000000000009 ?
 yes
 | ?- c1(10000000000000000000000000,X).
 X = 1590897978359414793 ? 
 yes
如何正确(高效)处理大小整数?
IIRC大整数不能作为“SP_integers”传递,因此我是否应该将这些值作为术语(“SP_term_ref”)传递,并进行适当的动态类型检查(可能随后进行数据提取)?救命啊

我不确定,但可能是因为integer有一个特定的大小。基本整数在范围内[−32767,+32767],长整数[−2147483647,+2147483647]…

您是正确的,外部类型
整数
对应于C类型
SP_整数
,只能用于小整数。对于任意大小的整数,您需要使用外部类型
term
,对应于C类型
SP_term\u ref
,并使用
SP_get_integer\u bytes()
函数获取字节。请参阅以了解更多关于此的信息


您不需要显式的动态类型检查,因为
SP\u get\u integer\u bytes()
适用于所有大小的整数,如果其参数不是整数,则会以错误代码的形式正常失败。

否,没有用于引发异常的C级便利函数。我们通常让我们的外部函数返回一个整数错误代码,然后调用Prolog代码用它来决定是否应该抛出异常。有关示例,请参阅库源代码。抛出异常的情况应该不常见,因此,如何执行并不影响效率。从Prolog抛出异常要容易得多。在使用“失败”作为结果时:结果代码可以传递比成功/失败更多的信息。事实并非如此:对于SICStus,
current\u prolog\u flag(bounded,F)
成功地使用
F=false