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

时间:2015-08-26 19:23:46

标签: io prolog swi-prolog prolog-toplevel

我已使用cat在SWI-Prolog中实施了copy_stream_data程序。

档案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).

当我从catstdin使用该程序stdout时,它会打印一个提示符|:,其中stdin输入来自|:。我该如何避免这种提示?

1 个答案:

答案 0 :(得分:0)

仅在stdout是终端时才会显示stdout提示。 prompt(_, '')是文件时不会出现。因此,当输出重定向到文件时,它不会在输出中导致垃圾。但是,它仍然不太好。

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

prompt(_, '')

您还可以在程序启动时使用 :- prompt(_, ''). 谓词放置一个子句,方法是在代码顶部插入以下内容:

:- module()

您甚至可以在{{1}}子句之后的模块中执行此操作。