Ограничение target_expansion/6 только временем компиляции

В SICStus Prolog есть хук для расширения цели: goal_expansion/6, который вызывается как во время компиляции, так и во время выполнения во время метавызова. Эти вызовы влекут за собой значительные накладные расходы во время выполнения, что замедляет метавызов. Целью моего расширения является только оптимизация. Таким образом, семантически цели и расширенные цели эквивалентны.

Как я могу отключить такие вызовы во время выполнения?

(Кажется, мне придется отменить goal_expansion/6, что мне кажется немного грубым. Это также помешало бы перекомпиляция).


person false    schedule 30.03.2016    source источник
comment
Я бы даже поддержал мнение, что оптимизация — это единственное законное использование расширения цели. Это означало бы, что это всегда необязательно и, вероятно, не должно выполняться автоматически для метавызовов и, возможно, даже утверждений.   -  person jschimpf    schedule 31.03.2016
comment
@jschimpf: (только предположение) Возможно, другие варианты использования включают в себя специальную обработку мета-аргументов или макросов. Не то, чтобы я знал о таком использовании. Например: добавление отладочной информации.   -  person false    schedule 31.03.2016


Ответы (2)


Идиоматический способ - загрузить код только во время компиляции, используя load_files/3 с опцией when(compile_time). К сожалению, это не поможет, если вы хотите (повторно) скомпилировать в том же процессе, в котором затем запускаете свой код.

Использование abolish для удаления определения goal_expansion/5 также не идеально (поскольку оно исчезнет, ​​если вы затем перекомпилируете). Это не так плохо/грубо, как кажется: goal_expansion/5 относится к каждому модулю, поэтому вы можете отменить его, не беспокоясь о том, что вы уничтожите некоторые функции в каком-то другом модуле.

person Per Mildner    schedule 30.03.2016

Обходным путем может быть вызов предиката prolog_load_context/2. Что-то типа:

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

Предикат prolog_load_context/2 выполняется только во время компиляции.

person Paulo Moura    schedule 30.03.2016