В SWI-Prolog, когда я вызываю copy_stream_data, как я могу избежать приглашения "|:"?

Я реализовал cat программа в SWI-Пролог с помощью 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, Как я могу избежать этой подсказки?

1 ответ

Решение

|: подсказка появляется только тогда, когда stdout это терминал. Не появляется когда stdout это файл Таким образом, это не вызовет мусора в выводе, когда ваш вывод перенаправлен в файл. Но все же, это не приятно.

Чтобы избежать появления подсказки, удалите ее, используя встроенный предикатprompt, как это: prompt(_, ''), который вы могли бы вставить в свой main(Argv) сказуемое:

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

Вы также можете поставить пункт с prompt(_, '') предикат при запуске программы, вставив в верхнюю часть кода следующее:

 :- prompt(_, '').

Вы могли бы даже сделать это в модуле, после :- module() пункт.

Другие вопросы по тегам