给定以下指令+谓词元组:
:- web_resource(plaintext/1, [content_type(text/plain)]).
plaintext(Result) :-
...code...
我如何告诉gplc
将这段代码转换成
plaintext([headers(['Content-Type'-'text/plain']),
payload(Payload)]) :-
old_plaintext(Payload).
old_plaintext(Payload) :-
...code...
在编译之前?old_payload
可以递归定义
GNU Prolog期限扩展目前是有限的。但是您可以使用Logtalk(它支持GNU Prolog)术语扩展机制来实现这种转换。简而言之,定义一个Logtalk钩子对象与您的扩展规则,然后扩展您的Prolog源文件,通过使用logtalk_compile/2
谓词。比如:
:- object(my_expansion,
implements(expading)).
term_expansion((:- web_resource(Name/Arity, Headers) Clauses) :-
% construct clauses
...
:- end_object.
然后:
$ gplgt
...
| ?- {my_expansion}.
...
| ?- logtalk_compile('my_source_file.pl', [hook(my_expansion), scratch_directory('.']).
...
最后一次查询将导致在当前目录中保存一个新的Prolog文件,其中包含扩展结果。您可以像往常一样使用gplc
编译这个文件。有关可移植Logtalk术语扩展机制的详细信息,请参见:https://logtalk.org/manuals/userman/expansion.html