Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module SICStus的make/0功能_Module_Prolog_Sicstus Prolog - Fatal编程技术网

Module SICStus的make/0功能

Module SICStus的make/0功能,module,prolog,sicstus-prolog,Module,Prolog,Sicstus Prolog,我如何确保所有模块(以及理想情况下已加载或包含的所有其他文件)都是最新的?发布use\u module(mymodule)时,SICStus比较文件mymodule.pl的修改日期,如果更新,则重新加载。另外,include-ed文件将触发重新编译。但它不会重新检查mymodule使用的所有模块 简而言之,我如何才能获得与SWI在make/0中提供的功能类似的功能?在SICStus Prolog中没有提供这种功能 一个大问题是,当前的序言过于动态,除了非常简单的情况外,make/0之类的东西无法

我如何确保所有模块(以及理想情况下已加载或包含的所有其他文件)都是最新的?发布
use\u module(mymodule)
时,SICStus比较文件
mymodule.pl
的修改日期,如果更新,则重新加载。另外,
include
-ed文件将触发重新编译。但它不会重新检查
mymodule
使用的所有模块


简而言之,我如何才能获得与SWI在
make/0
中提供的功能类似的功能?

在SICStus Prolog中没有提供这种功能

一个大问题是,当前的序言过于动态,除了非常简单的情况外,make/0之类的东西无法可靠地工作。使用诸如术语扩展、加载期间执行的目标(包括文件加载目标,这是常见的)等特性,不可能知道如何可靠地重新加载文件。我没有仔细研究过它,但SWI Prolog中的make/0可能也有同样的问题

我通常只是重新启动Prolog进程并再次加载“main”文件,即加载我需要的所有内容的文件

另外,我无法在注释中获取代码格式,因此我将其放在这里:示例为什么make/0需要防止“user”作为当前_模块/2中的文件:

| ?- [user].
% compiling user...
| :- module(m,[p/0]). p. end_of_file.

%  module m imported into user
% compiled user in module m, 0 msec 752 bytes
yes
| ?- current_module(M, F), F==user.
F = user,
M = m ? ;
no
| ?-

到目前为止,我与几个黑客一起生活:

高达0.7–模块前时间 SICStus总是有源自昆图斯的
sure_-loaded/1
,它不仅是一个指令(如ISO),而且也是一个命令。因此,我编写了自己的make谓词,简单地列举了所有文件:

l :-
   ensure_loaded([f1,f2,f3]).
在发出
l.
时,仅重新加载同时修改的文件

或许,我也可以这样写——我会读《平均值》(原文如此):

3.0–模块 随着模块的出现,情况发生了一些变化。一方面,有些文件是手动加载到模块中的,比如
确保加载(模块:[f1,f2,f3])
,然后是干净的模块。事实证明,有一种方法可以全局确保模块已加载,而不干扰实际的导入列表,只需声明
use\u module(m1,[])
,这又是一个指令和命令。重点是空列表,它导致模块被重新检查和加载,但由于空列表,语句可以在任何地方进行

同时,我使用以下模块:

:- module(make,[make/0]).

make :-
   \+ ( current_module(_, F), \+ use_module(F, []) ).
这适用于所有“合法”模块,只要接口不变。我仍然不喜欢它的冗长:对于每个选中的和未修改的模块,都有一条消息行。所以,当我只想检查所有内容是否都是最新的时,我会看到一个充满此类消息的页面。理想情况下,这样的信息只有在新的事情发生时才会显示出来

| ?- make.
% module m2 imported into make
% module m1 imported into make
% module SU_messages imported into make
yes
| ?- make.
% module m2 imported into make
% module m1 imported into make
% module SU_messages imported into make
yes
一项调查考虑了@PerMildner的评论

如果进一步的文件只与一个模块相关,则可以重新加载这些文件。特别是,加载到模块
user
中的文件与
.sicstusrc
类似。有关完整代码,请参见上面的链接

   % reload files that are implicitly modules, but that are still simple to reload
    \+ (
            source_file(F),
            F \== user,
            \+ current_module(_, F),  % not officially declared as a module
            setof(M,
                P^ExF^ExM^(
                    source_file(M:P,F),
                    \+ current_module(M,ExF), % not part of an official module
                    \+ predicate_property(M:P,multifile),
                    \+ predicate_property(M:P,imported_from(ExM))
                    ),[M]),   % only one module per file, others are too complex
            \+ ensure_loaded(M:F)
    ).


请注意,在SWI中,既不
确保\u加载/1
也不
使用\u模块/2
比较文件修改日期。因此,这两种方法都不能用于确保加载文件的最新版本。

。在SWI Prolog中,我经常对简单的程序使用
make/0
,但通常会得到类似
ERROR:Socket ERROR:Address ready In use
的内容,这些内容与稍微复杂的客户端/服务器应用程序类似,HTTP库等@mat:您是否正确使用了
初始化/1
?Ad P.S.:在您的示例中,不针对
用户
进行测试的效果是系统在
生成时以交互方式提示
,这当然很烦人。也许,在这种情况下,一个错误是最好的——用
[user]
加载整个模块——我一生中从未这样做过。无关的导入消息是一个bug。请注意,它们仅在导入列表为空时发生。您应该添加一个F\==用户,以防止在顶层定义模块的可能性。
   % reload files that are implicitly modules, but that are still simple to reload
    \+ (
            source_file(F),
            F \== user,
            \+ current_module(_, F),  % not officially declared as a module
            setof(M,
                P^ExF^ExM^(
                    source_file(M:P,F),
                    \+ current_module(M,ExF), % not part of an official module
                    \+ predicate_property(M:P,multifile),
                    \+ predicate_property(M:P,imported_from(ExM))
                    ),[M]),   % only one module per file, others are too complex
            \+ ensure_loaded(M:F)
    ).