如何提取文件中存在的模块名称和可选谓词?
如果我有一个包含对一个或多个模块的调用的 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]]
感谢。
答案 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作者的帮助下编写的。