在开发“微型”模块时,我最近发明了枢轴。它们受到线程/管道模式的启发来传递数据。枢轴是最大长度为 1 的有界队列,pivot_put/1 也会复制给定的术语。但出于性能原因,它们不使用同步并且是非阻塞的。
到目前为止,它们与 nb_setarg/3 非常相似,只是它们不破坏 Prolog 术语,而是更新 Java 数据结构。因此,它们比非逻辑项操作更安全一些。他们也不需要一些 call_cleanup/3,因为它们是 Java 垃圾收集的。
到目前为止,它们比 nb_setarg/3 更相似,而不是使用一些显式分配和释放结构。例如,SICStus Prolog 的解决方案可能是:
call_nth(Goal_0, Nth) :-
new(unsigned_32, Counter),
call_cleanup(call_nth1(Goal_0, Counter, Nth),
dispose(Counter)).
call_nth1(Goal_0, Counter, Nth) :-
call(Goal_0),
get_contents(Counter, contents, Count0),
Count1 is Count0+1,
put_contents(Counter, contents, Count1),
Nth = Count1.
有了pivot,甚至没有32位的限制,我们可以直接做:
call_nth(G, C) :-
pivot_new(P),
pivot_put(P, 0),
call(G),
pivot_take(P, M),
N is M+1,
pivot_put(P, N),
C = N.