在SICStus Prolog中,有一个用于扩展目标的钩子:goal_expansion/6,它在元调用期间既可以在编译时调用,也可以在运行时调用。这些调用会产生相当多的运行时开销,这会减慢元调用的速度。我扩展的目的仅仅是优化。因此,在语义上,目标和扩展的目标是等价的。
如何在运行时禁用此类调用?
(似乎我不得不废除goal_expansion/6,因为它在我看来有点粗鲁。这也会阻碍lightweight recompilation)。
发布于 2016-03-31 06:46:35
惯用的方法是使用带有when(compile_time)选项的load_files/3加载仅编译时的代码。不幸的是,如果您想在运行代码的相同进程中(重新)编译,这并没有什么帮助。
使用abolish删除goal_expansion/5的定义也不理想(因为如果重新编译,它就会消失)。然而,它并不像看起来那么糟糕/粗糙:goal_expansion/5是每个模块的,所以你可以取消它,而不用担心你会破坏其他模块中的一些功能。
发布于 2016-03-31 06:18:45
一种解决方法是调用prolog_load_context/2谓词。类似于:
goal_expansion(...) :-
prolog_load_context(source, _),
% compile-time; expand the goal
... .prolog_load_context/2谓词仅在编译时成功。
https://stackoverflow.com/questions/36318462
复制相似问题