3

给定以下指令+谓词元组:

:- 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可以递归定义。

4

1 回答 1

1

GNU Prolog术语扩展目前是有限的。但是您可以使用 Logtalk(支持 GNU Prolog)术语扩展机制来实现该转换。简而言之,使用您的扩展规则定义一个 Logtalk挂钩对象,然后使用logtalk_compile/2谓词扩展您的 Prolog 源文件。就像是:

:- 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

于 2021-08-17T14:13:28.530 回答