如何在文件中提取模块的名称?

时间:2013-05-14 07:58:27

标签: prolog swi-prolog

如何提取文件中存在的模块名称和可选谓词?

如果我有一个包含对一个或多个模块的调用的 file.pl ,我该如何在模块声明中提取这些模块的名称和谓词的名称?

示例:如果我的文件包含对模块的调用

:- use_module(library(lists), [ member/2,
                                append/2 as list_concat
                              ]).
:- use_module(library(option).

我想创建一个predicate extract(file.pl)

输出 List=[[list,member,append],[option]]

感谢。

1 个答案:

答案 0 :(得分:1)

假设SWI-Prolog(标记为)。您可以编写类似于我在Prlog编译器的Logtalk适配器文件中所做的操作:

list_of_exports(File, Module, Exports) :-
    absolute_file_name(File, Path, [file_type(prolog), access(read), file_errors(fail)]),
    module_property(Module, file(Path)),    % only succeeds for loaded modules
    module_property(Module, exports(Exports)),
    !.
list_of_exports(File, Module, Exports) :-
    absolute_file_name(File, Path, [file_type(prolog), access(read), file_errors(fail)]),
    open(Path, read, In),
    (   peek_char(In, #) ->                 % deal with #! script; if not present
        skip(In, 10)                        % assume that the module declaration
    ;   true                                % is the first directive on the file
    ),
    setup_call_cleanup(true, read(In, ModuleDecl), close(In)),
    ModuleDecl = (:- module(Module, Exports)),
    (   var(Module) ->
        file_base_name(Path, Base),
        file_name_extension(Module, _, Base)
    ;   true
    ).

请注意,此代码不处理可能作为文件第一项出现的encoding / 1指令。该代码很久以前也是在SWI-Prolog作者的帮助下编写的。