Все еще изучая основы SICStus Prolog 4 FFI to C, у меня есть конкретный вопрос о примере предиката c1/2 в https://sicstus.sics.se/sicstus/docs/latest4/html./sicstus.html/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») и выполнять подходящие проверки динамического типа (возможно, с последующим извлечением данных)? Помоги пожалуйста!