Erlang的Eshell如何使输入行不受异步输出的影响?

Erlang的Eshell如何使输入行不受异步输出的影响?,erlang,erl,Erlang,Erl,我想用Erlang以外的另一种语言实现REPL,我对交互式erl Eshell提示符的这一特性非常感兴趣: 1> spawn(fun() -> timer:sleep(5000), io:format("~p~n", ["later"]) end). <0.34.0> 2> i can ty 在其他语言(如Bash或Node.js)中,这可能会导致以下结果: 2> i can ty"later" pe... Erlang是如何做到这一点的?我试着在谷歌上搜

我想用Erlang以外的另一种语言实现REPL,我对交互式erl Eshell提示符的这一特性非常感兴趣:

1> spawn(fun() -> timer:sleep(5000), io:format("~p~n", ["later"]) end).
<0.34.0>
2> i can ty
在其他语言(如Bash或Node.js)中,这可能会导致以下结果:

2> i can ty"later"
pe...

Erlang是如何做到这一点的?我试着在谷歌上搜索,甚至快速浏览了一下它的源代码,但无法找到这是如何实现的。我假设它必须涉及一些终端控制序列?

Erlang shell比其他语言更复杂,因为它必须与具有许多进程的分布式系统一起工作。弗雷德·赫伯特写了一篇关于Erlang shell的文章,名为

基本上,当您调用io:format时,它会向其组长发送一条消息。在弗雷德的另一篇文章中,有一条关于团队领导和团队成员的注释

正如@rightfold在他的评论中提到的,io_协议涉及发送消息。这意味着,它们是按顺序写入控制台的。在其他语言中,如果有更多进程同时写入,则可以将部分消息交错,但不能使用Erlang。协议还包括等待回复。例如,检查io:execute\u请求


用户\u drv负责将消息写入实际tty,它使用ncurses将消息放在它想要的位置,这样它就可以在您开始编写命令之前插入消息,从而留下干净的历史记录。

这不是一个简单的问题,老实说,您可能在这里找不到答案。如果你真的感兴趣,你可以点击erlang mailig列表,所有酷猫都会出现在那里:erlang-questions@erlang.orgWriting对stdout的访问是通过一个进程完成的。发送给它的消息可能会被shell截获。谢谢。我认为它对ncurses的使用是一个关键的洞察。
2> i can ty"later"
pe...