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

In SWI-Prolog, when calling copy_stream_data, how can I avoid the '|: ' prompt?

我已经使用 copy_stream_data 在 SWI-Prolog 中实现了一个 cat 程序。

文件args.pl:

:- module(args, [withFilesOrUserInput/2]).

withFilesOrUserInput(StreamFunction, []) :-
    call(StreamFunction, user_input).

withFilesOrUserInput(StreamFunction, [Filename]) :-
    withFile(StreamFunction, Filename).

withFilesOrUserInput(StreamFunction, [Head|Tail]) :-
    withFile(StreamFunction, Head),
    withFilesOrUserInput(StreamFunction, Tail).

withFile(StreamFunction, Filename) :-
    open(Filename, read, StreamIn),
    call(StreamFunction, StreamIn),
    close(StreamIn).

文件cat.pl:

:- use_module(args).

main(Argv) :-
    withFilesOrUserInput(catStream, Argv).

catStream(Stream) :-
    copy_stream_data(Stream, user_output),
    flush_output(user_output).

当我使用该程序从 stdinstdout cat 时,它会打印一个提示符 |:,它需要来自 stdin 的输入。我怎样才能避免该提示?

|: 提示仅在 stdout 是终端时出现。当 stdout 是一个文件时它不会出现。因此,当您的输出重定向到文件时,它不会在输出中造成垃圾。但是,还是不太好。

为了避免提示,使用 built-in predicate prompt 清除它,如下所示:prompt(_, ''),您可以将其插入到 main(Argv) 谓词中:

main(Argv) :-
    prompt(_, ''),
    withFilesOrUserInput(catStream, Argv).

您还可以在程序开始时放置一个带有 prompt(_, '') 谓词的子句,方法是在代码顶部插入以下内容:

 :- prompt(_, '').

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