将goal_expansion/6限制为仅编译时间

fal*_*lse 5 prolog sicstus-prolog

在SICStus Prolog中,有一个用于扩展目标的钩子:goal_expansion/6在编译时和在运行期间在metacalling中调用.这些调用会产生相当多的运行时开销,从而减慢了metacalling的速度.我扩展的目的只是优化.从语义上讲,目标和扩展目标是等价的.

如何在运行时禁用此类调用?

(似乎我不得不废除goal_expansion/6对我来说看起来有点粗鲁.它也会妨碍轻量级的重新编译).

Per*_*ner 5

惯用的方法是使用load_files/3with选项加载仅编译时代码when(compile_time).不幸的是,如果你想在运行代码的同一个进程中(重新)编译,这没有任何帮助.

使用abolish删除定义goal_expansion/5也不理想(因为如果你重新编译就会消失).尽管如此,它并不像看起来那么糟糕/粗鲁:goal_expansion/5是每个模块,所以你可以废除它而不用担心你破坏了某些其他模块中的某些功能.


Pau*_*ura 4

解决方法是调用谓词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谓词仅在编译时成功。