Подключение к интерактивным инструментам с использованием Chicken Scheme `process`?
Я пытаюсь выяснить схему курицы process
процедура.
Когда я запускаю его в интерпретаторе, этот пример кода выполняет то, что я ожидаю (выводит "Hello, world!"):
(use posix)
(let-values (((in out pid) (process "echo \"Hello, world!\"")))
(print (read-line in)))
Исходя из этого, я ожидаю, что если я echo \"Hello, world!\"
с bc
Я должен увидеть первую строку bc
обычная преамбула:
bc 1.06
Вместо этого я получаю пустую строку и не получаю подсказку переводчика снова, пока не нажму Ctrl-C
,
Или иногда я получаю эту ошибку:
thread is registered for I/O on unknown file-descriptor: 33 (expected 31)
[]
...more...
<syntax>
<syntax>
<syntax>
<syntax>
<syntax>
<syntax>
<syntax>
<syntax>
<syntax>
<syntax>
<syntax>
<eval>
<eval>
<eval>
<eval>
<eval> <--
и меня выгнали обратно к моему приглашению оболочки.
Кроме того, как я могу получить процесс, который я начал, чтобы ответить на ввод? Я ожидаю, что следующее напечатать 4
, но вместо этого снова получите пустую строку:
(let-values (((in out pid) (process "bc")))
(begin
(display "2 + 2" out)
(print (read-line in))))
(Как) я могу использовать process
иметь интерактивный диалог с таким инструментом, как bc
?
1 ответ
Есть несколько компонентов этого вопроса. Первое, что вы уже поняли: bc обнаружит, что он не работает на терминале, поэтому не будет печатать баннер.
Второй - простая буферизация строки: в UNIX простая печать на порт не будет фактически отправлять какие-либо данные, если вы явно не очистите или не отправите новую строку. В курице это можно сделать, позвонив flush-output
на желаемом порту или добавление новой строки к вызову дисплея. Я думаю, что bc будет читать до тех пор, пока не увидит символ новой строки, так что очистка вряд ли поможет здесь. Так что либо позвони newline
в порту или используйте (display "2 + 2\n" out)
вместо (display "2 + 2" out)
,
Третья - это настоящая ошибка: вы получаете сообщение об неожиданном дескрипторе файла. Я подал отчет об ошибке, спасибо, что указал на это!