В 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()
пункт.