Входной поток - закрытие - PullRequest
1 голос
/ 29 мая 2011

Как закрыть входной поток в SWI-Prolog, используя комбинацию <CTRL>+<D>?

bot:-
   repeat,
     write('>'),
     readln(X), nl,
     answer(X, Answer),
     write(Answer), nl,
    end(X).

end(X):-member('end',X).

Where X is a list of keywords to that bot

Как мне изменить исходный код, чтобы получить такой результат?

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

Как ведущий разработчик SWI-Prolog Ян Вилемейкер рекомендует :

[readln] это что-то из старой практики. Это не очень хорошо определено. Используйте предикаты library(readutil). Они задокументированы и лучше разработаны.

0 голосов
/ 30 мая 2011

Я уже нашел решение.Чтобы получить такой результат, я должен применить at_end_of_stream и вырезать «! ».

bot:-
    write('Hello'),
    nl,
    write('>'),
    repeat,
    readln(X),
    answer(X, Answer),
    write(Answer),
    nl,
    write('>'),
    at_end_of_stream, !.

Последние две строки кода заставляют его работать так, как я ожидал.Теперь, используя комбинацию Ctrl+D, мы можем остановить ее (закрыть поток, который аналогичен отключению бота).

@ larsmans: Приятно осознавать, что readln - это плохо или просто не оптимально.Возможно, в следующий раз я воспользуюсь этим советом.:)

...