0

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

catからstdinへのプログラムを使用すると、 からの入力が必要な場所にstdoutプロンプ​​トが出力されます。どうすればそのプロンプトを回避できますか?|:stdin

4

1 に答える 1

0

|:プロンプトstdoutは、 が端末の場合にのみ表示されます。ファイルの場合は表示されませんstdout。したがって、出力がファイルにリダイレクトされたときに、出力にガベージが発生することはありません。しかし、それでも、それはいいことではありません。

プロンプトを回避するには、次のように組み込みの述語promptを使用してクリアします: 、述語にprompt(_, '')挿入できます。main(Argv)

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

prompt(_, '')コードの先頭に次を挿入することにより、プログラムの開始時に述語を含む句を配置することもできます。

 :- prompt(_, '').

:- module()句の後に、モジュールでそれを行うこともできます。

于 2015-08-26T19:23:45.617 に答える