首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将goal_expansion/6限制为仅编译时

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

Stack Overflow用户
提问于 2016-03-31 03:53:34
回答 2查看 65关注 0票数 5

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

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

(似乎我不得不废除goal_expansion/6,因为它在我看来有点粗鲁。这也会阻碍lightweight recompilation)。

EN

回答 2

Stack Overflow用户

发布于 2016-03-31 06:46:35

惯用的方法是使用带有when(compile_time)选项的load_files/3加载仅编译时的代码。不幸的是,如果您想在运行代码的相同进程中(重新)编译,这并没有什么帮助。

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

票数 5
EN

Stack Overflow用户

发布于 2016-03-31 06:18:45

一种解决方法是调用prolog_load_context/2谓词。类似于:

代码语言:javascript
复制
goal_expansion(...) :-
    prolog_load_context(source, _),
    % compile-time; expand the goal
    ... .

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36318462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档