Есть ли способ использовать модуль /2 в ECLiPSe Prolog?
В SWI-Prolog я использую код, такой как в начале текстового файла модуля:
:- module(foo, [bar/2]).
:- use_module(library(jack)).
Я не хочу менять свой код. Как я могу использовать ECLiPSe Prolog (*). Есть ли библиотека, которая определяет module/2
директива в эклипсе пролог?
С уважением
4 ответа
Следующий код определяет макрос, который отображает module/2 в директивы module/3:
:- export macro((:-)/1, translate_directive/2, [top_only]).
translate_directive(
(:- module(Module, Exports)),
(:- module(Module, Exports, [swi]))
).
Скомпилируйте (или импортируйте) это перед компиляцией модуля, написанного для SWI. Обратите внимание, что третий аргумент module/3 должен содержать языковой модуль, соответствующий диалекту, на котором написан ваш модуль. Я использовал swi
здесь, другие варианты будут quintus
, iso
или ECLiPSe родной eclipse_language
,
Вы можете скомпилировать модуль Prolog, который использует систему модулей SWI-Prolog, используя Logtalk для использования с ECLiPSe (или любым другим из поддерживаемых компиляторов Prolog, включая те, которые не предоставляют систему модулей).
Нет, есть только module/1
а также module/3
,
Вы можете увидеть список всего, что доступно здесь: http://eclipseclp.org/doc/bips/fullindex.html
SWI-Пролог (другие) module/2
директивы могут быть заменены на ECLiPSe module/1
+ export/1
директивы, как вы, вероятно, уже узнали. Также SWI-Prolog и ECLiPSe поддерживают директивы условной компиляции и dialect
флаг. Это должно предоставить вам другую альтернативу (не проверенную) для использования одних и тех же файлов Prolog с обеими системами:
:- if(current_prolog_flag(dialect, swi)).
:- module(foo, [p/1]).
:- elif(current_prolog_flag(dialect, eclipse)).
:- module(foo).
:- export(p/1).
:- else.
...
:- endif.