在SICStus Prolog中,有一个用于扩展目标的钩子:goal_expansion/6
,它在编译时和运行时在metacalling期间调用。这些调用会产生相当多的运行时开销,从而减慢了metacalling的速度。我扩展的目的只是优化。从语义上讲,目标和扩展目标是等价的。
如何在运行时禁用此类调用?
(似乎我必须废除goal_expansion/6
,这看起来有点粗鲁。它也会妨碍lightweight recompilation)。
答案 0 :(得分:5)
惯用方法是使用带有选项load_files/3
的{{1}}加载仅编译时代码。不幸的是,如果你想在运行你的代码的同一个过程中(重新)编译,这没有任何帮助。
使用when(compile_time)
删除abolish
的定义也不理想(因为如果你重新编译它就会消失)。但它并不像看起来那么糟糕/粗鲁:goal_expansion/5
是每个模块,因此您可以废除它而不必担心会破坏其他模块中的某些功能。
答案 1 :(得分:4)
解决方法是调用div float: left; width: 100% - 500px; (i.e. this should take up all the remaining space)
div float: right; width: 250px;
div float: right; width: 250px;
谓词。
类似的东西:
prolog_load_context/2
goal_expansion(...) :-
prolog_load_context(source, _),
% compile-time; expand the goal
... .
谓词仅在编译时成功。