5

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

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

(看来我必须取消goal_expansion/6这对我来说有点粗鲁。它也会妨碍轻量级重新编译)。

4

2 回答 2

5

load_files/3惯用的方法是使用with option加载仅编译时的代码when(compile_time)。不幸的是,如果您想在运行代码的同一进程中(重新)编译,这无济于事。

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

于 2016-03-30T22:46:35.077 回答
4

一种解决方法是调用prolog_load_context/2谓词。就像是:

goal_expansion(...) :-
    prolog_load_context(source, _),
    % compile-time; expand the goal
    ... .

谓词仅在prolog_load_context/2编译时成功。

于 2016-03-30T22:18:45.410 回答