Подключение к интерактивным инструментам с использованием 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),

Третья - это настоящая ошибка: вы получаете сообщение об неожиданном дескрипторе файла. Я подал отчет об ошибке, спасибо, что указал на это!

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