【发布时间】:2014-11-29 15:40:36
【问题描述】:
我想用 Erlang 以外的另一种语言实现 REPL,我对交互式 erl (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 是如何做到这一点的?我试过用谷歌搜索,甚至快速浏览了它的源代码,但不知道这是如何完成的。我认为它必须涉及一些终端控制序列?
【问题讨论】:
-
这不是一个简单的问题,老实说你可能在这里找不到答案。如果你真的有兴趣,你可以点击 erlang mailig list,所有酷猫都在那里闲逛:
erlang-questions@erlang.org -
写入标准输出是由一个进程完成的。发送给它的消息可能会被 shell 拦截。