SICStus Prolog 4 FFI から C へのロープをまだ学習中ですが、https://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/ の例の述語 c1/2 について具体的な質問があります。 Foreign-Code-Examples.html#Foreign-Code-Examples .
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
小さい整数と大きい整数の両方を正しく (そして効率的に) 処理するにはどうすればよいですか? IIRC の大きな整数は "SP_integers" として渡すことができないため、これらの値を項 ("SP_term_ref") として渡し、適切な動的型チェックを行う必要があります (データ抽出が続く可能性があります)。助けてください!