Экспорт предикатов с помощью :- модуля

Я знаю, что могу экспортировать предикаты для модуля, используя стандартное объявление:

:- module(my_test, [hello/1]).

hello(a).
hello(b).

Но хотел узнать, есть ли другой способ экспортировать предикат hello в модуль my_test? В приведенном ниже примере какой код мне нужно заполнить, чтобы директива my_export сделала это за меня?

:- module(my_test, []).

hello(a).
hello(b).
:- my_export(hello/1).

Я не совсем понимаю импорт/экспорт, но это единственные реальные способы, которые я могу придумать.


person DaveEdelstein    schedule 30.11.2011    source источник
comment
Можете ли вы сказать нам, почему вы хотите этого? Скорее всего, вы зависели бы от какого-то внутреннего предположения, которое легко меняется от версии к версии.   -  person false    schedule 02.12.2011
comment
я хотел бы написать макрос system:term_expansion, который изменяет имя и арность правила. например, макрос, который превращает hello(a) в my_hello(a, testcase123), тогда я бы хотел, чтобы он был экспортирован для текущего модуля. в идеале system:term_expansion вызовет эту функцию «экспорта».   -  person DaveEdelstein    schedule 05.01.2012


Ответы (1)


Просто используя

:- export(hello/1).

должен сделать трюк.

person twinterer    schedule 30.11.2011
comment
экспорт должен вызываться как директива? Как вы думаете, я могу вызвать экспорт во время system:term_expansion? - person DaveEdelstein; 30.11.2011
comment
Я не очень хорошо знаком с SWI, но, насколько мне известно, модульная система аналогична той, что используется в ECLiPSe. Для статических предикатов вы можете использовать export/1 в качестве директивы. Для динамически генерируемых предикатов вы можете вызывать export/1 из своего кода после того, как предикат был сгенерирован. - person twinterer; 30.11.2011