Io 在SWI Prolog中,调用copy_stream_data时,如何避免出现“|::”提示?

Io 在SWI Prolog中,调用copy_stream_data时,如何避免出现“|::”提示?,io,prolog,swi-prolog,prolog-toplevel,Io,Prolog,Swi Prolog,Prolog Toplevel,我已经使用copy_stream_数据在SWI Prolog中实现了一个cat程序 文件args.pl: 文件cat.pl: 当我使用程序从stdin到stdout进行cat时,它会打印一个提示|:它希望从stdin输入。如何避免该提示?只有在stdout是终端时才会出现|:提示。当标准输出为文件时,它不会出现。因此,当您的输出被重定向到文件时,它不会在输出中造成垃圾。但还是不好 为了避免出现提示,请使用以下命令清除提示:prompt\u,您可以将其插入mainArgv谓词中: main(Arg

我已经使用copy_stream_数据在SWI Prolog中实现了一个cat程序

文件args.pl:

文件cat.pl:

当我使用程序从stdin到stdout进行cat时,它会打印一个提示|:它希望从stdin输入。如何避免该提示?

只有在stdout是终端时才会出现|:提示。当标准输出为文件时,它不会出现。因此,当您的输出被重定向到文件时,它不会在输出中造成垃圾。但还是不好

为了避免出现提示,请使用以下命令清除提示:prompt\u,您可以将其插入mainArgv谓词中:

main(Argv) :-
    prompt(_, ''),
    withFilesOrUserInput(catStream, Argv).
您还可以通过在代码顶部插入以下内容,在程序开始时放置一个带有提示的谓词的子句:

 :- prompt(_, '').

您甚至可以在模块中:-module子句之后执行此操作。

不惜任何代价避免这种黑客行为。@false为什么您认为应该避免这种黑客行为?我不知道有任何其他语言会以如此奇怪的方式开始提示,仅仅是因为当stdout是终端时,程序开始从stdin读取数据。这甚至不符合逻辑,我认为这是一个错误。只有当stdin和stdout都是终端时才有意义提示。但是,当这个程序像prolog-qt main cat.pl一样被调用时,这是一个黑客行为,因为您正在更改全局状态,以使其能够以交互方式使用。不过你说得有道理。其他更符合要求的系统(如SICStus)仅在输入为终端时显示此提示。不是回答,而是对代码的注释。设置\u调用\u清理/3可正确处理此类情况。在您的版本中,如果callStreamFunction出现故障或错误,StreamIn将不会关闭流。如果您有几个答案,您将尝试访问一个已经关闭的流。是的,我仍在学习如何正确地在Prolog中执行I/O。让我们看看我什么时候学会如何正确使用setup\u call\u cleanup/3,也许今天,也许明天。然而,我不知道几个答案会如何导致访问一个已经关闭的流,但也许有一些关于这一点我还不明白?
main(Argv) :-
    prompt(_, ''),
    withFilesOrUserInput(catStream, Argv).
 :- prompt(_, '').