在 SICStus Prolog 中,有一个用于扩展目标的钩子:goal_expansion/6
它在编译时和运行时在元调用期间都被调用。这些调用会产生相当多的运行时开销,从而减慢元调用的速度。我扩展的目的只是优化。所以在语义上目标和扩展目标是等价的。
如何在运行时禁用此类调用?
(看来我必须取消goal_expansion/6
这对我来说有点粗鲁。它也会妨碍轻量级重新编译)。
在 SICStus Prolog 中,有一个用于扩展目标的钩子:goal_expansion/6
它在编译时和运行时在元调用期间都被调用。这些调用会产生相当多的运行时开销,从而减慢元调用的速度。我扩展的目的只是优化。所以在语义上目标和扩展目标是等价的。
如何在运行时禁用此类调用?
(看来我必须取消goal_expansion/6
这对我来说有点粗鲁。它也会妨碍轻量级重新编译)。
load_files/3
惯用的方法是使用with option加载仅编译时的代码when(compile_time)
。不幸的是,如果您想在运行代码的同一进程中(重新)编译,这无济于事。
使用abolish
删除定义goal_expansion/5
也不理想(因为如果你重新编译它就会消失)。不过,它并不像看起来那么糟糕/粗鲁:goal_expansion/5
是每个模块的,因此您可以取消它而不必担心会破坏其他模块中的某些功能。
一种解决方法是调用prolog_load_context/2
谓词。就像是:
goal_expansion(...) :-
prolog_load_context(source, _),
% compile-time; expand the goal
... .
谓词仅在prolog_load_context/2
编译时成功。