2014-10-04 68 views
2

我想实现比二郎其他语言的REPL,和我真的交互式erl(ESHELL)提示的这一特点很感兴趣:Erlang的Eshell如何保持输入行不受异步输出的影响?

1> spawn(fun() -> timer:sleep(5000), io:format("~p~n", ["later"]) end). 
<0.34.0> 
2> i can ty 

因此,我在这里做的是,最终酿出一些后台进程写入终端。在此期间,我已经输入i can ty只是五秒钟过去了,并"later"被插入的正上方2>,导致:

1> spawn(fun() -> timer:sleep(5000), io:format("~p~n", ["later"]) end). 
<0.34.0> 
"later"  
2> i can type... 

在其他语言,如bash或Node.js的,这宁可导致在类似的东西:

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

Erlang如何做到这一点?我尝试过使用Google搜索,甚至快速查看其源代码,但无法找出如何完成。我认为它必须涉及一些终端控制序列?

+0

这不是一个简单的问题,说实话,你可能在这里找不到答案。如果你真的感兴趣,你可能会碰到erlang的邮件列表,那里所有的酷猫都挂了:'erlang-questions @ erlang.org' – mpm 2014-10-05 00:20:09

+0

写入stdout是由一个进程完成的。发送给它的消息可能被shell拦截。 – rightfold 2014-10-05 00:25:29

回答

4

Erlang shell比其他语言更复杂,因为它必须与具有多个进程的分布式系统一起工作。 Fred Hebert写了关于Erlang shell的文章,名字叫“As bad as anything else”。

基本上,当您拨打io:format时,它会向其组长发送消息。在“Learn you some Erlang/Building OTP applications”(再次由弗雷德)有一个关于组长的说明和io protocol

正如@rightfold在他的评论中提到的,io_protocol涉及发送消息。这意味着它们被顺序写入控制台。在其他语言中,如果你有更多的进程在同一时间写入,你可以使部分消息交错,但不是Erlang。该协议还涉及等待​​答复。例如,检查io:execute_requeston github

user_drv负责撰写该消息实际tty它使用ncurses把它,它想要的,所以它可以插入命令之前,你开始写,这让干净的历史信息。

+0

谢谢。我认为它使用'ncurses'是一个关键的洞察力。 – 2014-10-05 14:28:19