Я реализовал программу 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
. Как я могу избежать этой подсказки?
setup_call_cleanup/3
для правильной обработки таких ситуаций. В вашей версии неудачный или ошибочныйcall(StreamFunction, StreamIn)
не закроет поток. А если у вас будет несколько ответов, вы попытаетесь получить доступ к уже закрытому потоку. - person false   schedule 27.08.2015setup_call_cleanup/3
, может быть, сегодня, может быть, завтра. Однако я не понимаю, как несколько ответов приведут к доступу к уже закрытому потоку, но, может быть, в этом есть что-то, чего я еще не понимаю? - person Christian Hujer   schedule 27.08.2015