5

SICStus Prolog には、ゴールを展開するためのフックがあります。goal_expansion/6これは、コンパイル時と実行時の両方でメタ呼び出し中に呼び出されます。これらの呼び出しは、かなりの実行時オーバーヘッドを引き起こし、メタ呼び出しを遅くします。私の拡張の目的は最適化のみです。したがって、意味的には、ゴールと拡張ゴールは同等です。

実行時にそのような呼び出しを無効にするにはどうすればよいですか?

(私には少し粗雑に見えるものを廃止する必要があるようです。軽量の再コンパイルgoal_expansion/6も妨げられます)。

4

2 に答える 2

5

load_files/3慣用的な方法は、 with オプションを使用してコンパイル時のみのコードをロードすること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 に答える