fal*_*lse 5 prolog sicstus-prolog
在SICStus Prolog中,有一个用于扩展目标的钩子:goal_expansion/6
在编译时和在运行期间在metacalling中调用.这些调用会产生相当多的运行时开销,从而减慢了metacalling的速度.我扩展的目的只是优化.从语义上讲,目标和扩展目标是等价的.
如何在运行时禁用此类调用?
(似乎我不得不废除goal_expansion/6
对我来说看起来有点粗鲁.它也会妨碍轻量级的重新编译).
惯用的方法是使用load_files/3
with选项加载仅编译时代码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
... .
Run Code Online (Sandbox Code Playgroud)
该prolog_load_context/2
谓词仅在编译时成功。