使用 Chicken Scheme 的“进程”连接到交互式工具?
Connecting to interactive tools using Chicken Scheme's `process`?
我正在尝试找出 Chicken Scheme 的 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> <--
然后我被踢回 shell 提示符。
另外,如何让我已经启动的进程响应输入?我希望以下内容打印 4
,但会再次出现空行:
(let-values (((in out pid) (process "bc")))
(begin
(display "2 + 2" out)
(print (read-line in))))
(如何)我可以使用 process
与 bc
这样的工具进行交互对话?
这个问题有几个组成部分。第一个你已经想通了:bc 会在终端上检测到它不是 运行,所以它不会打印横幅。
第二个是简单的行缓冲:在 UNIX 中,简单地打印到一个端口不会实际发送任何数据,除非您显式刷新或发送换行符。在 CHICKEN 中,这可以通过在所需端口上调用 flush-output
或将换行符附加到显示调用来完成。我认为 bc 会一直读到它看到一个换行符,所以冲洗在这里不太可能有帮助。因此,要么在端口上调用 newline
,要么使用 (display "2 + 2\n" out)
而不是 (display "2 + 2" out)
。
第三个是实际的错误:关于意外文件描述符的错误。我已经为此提交了 a bug report,感谢您指出!
我正在尝试找出 Chicken Scheme 的 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> <--
然后我被踢回 shell 提示符。
另外,如何让我已经启动的进程响应输入?我希望以下内容打印 4
,但会再次出现空行:
(let-values (((in out pid) (process "bc")))
(begin
(display "2 + 2" out)
(print (read-line in))))
(如何)我可以使用 process
与 bc
这样的工具进行交互对话?
这个问题有几个组成部分。第一个你已经想通了:bc 会在终端上检测到它不是 运行,所以它不会打印横幅。
第二个是简单的行缓冲:在 UNIX 中,简单地打印到一个端口不会实际发送任何数据,除非您显式刷新或发送换行符。在 CHICKEN 中,这可以通过在所需端口上调用 flush-output
或将换行符附加到显示调用来完成。我认为 bc 会一直读到它看到一个换行符,所以冲洗在这里不太可能有帮助。因此,要么在端口上调用 newline
,要么使用 (display "2 + 2\n" out)
而不是 (display "2 + 2" out)
。
第三个是实际的错误:关于意外文件描述符的错误。我已经为此提交了 a bug report,感谢您指出!