小编par*_*oty的帖子

对elixir的任何readline绑定支持?

我试图创造出接受用户输入的类似的方式,程序iexerl做(例如:按允许键来浏览过去的历史时).

如果标准IO.gets使用如下,

IO.gets "user> "
Run Code Online (Sandbox Code Playgroud)

按下向上允许时,控制台最终会出现以下情况.

user> ^[[A^[[A
Run Code Online (Sandbox Code Playgroud)

是否有任何函数/库具有可在elixir代码中使用的readline功能?


到目前为止我调查的是,

  • 有些语言对readline库有绑定支持,但我无法找到elixir的相应功能.
  • iex实现似乎将此功能委托给erl(/lib/iex/history.ex似乎只是管理历史列表),但我无法在erlang方面找到相应的功能.
  • 我试过了erl_ddll.load,但未能从以下方面走得更远.

在iex上,

iex(4)> :erl_ddll.load('/usr/lib', 'libreadline')
{:error, {:open_error, -10}}
iex(5)> :erl_ddll.format_error({:open_error, -10})
'dlopen(/usr/lib/libreadline.so, 2): image not found'
Run Code Online (Sandbox Code Playgroud)

我在OSX,并通过自制安装libreadline,我可以找到libreadline.dylib/usr/lib.


[关于目的的附加说明]

我正在使用elixir进行以下(mal)实验,这是一个用各种语言实现的lisp repl(但不是用elixir/erlang实现).

https://github.com/kanaka/mal

该步骤的一部分是使用历史记录实现repl,并且如果不是本地语言,则某些语言正在使用readline绑定库.

[更新一点 - 2015/3/22]

我尝试使用NIF方法(与encurses类似)来使用readline库.我可以在erlang(erl)上做一些工作,但是坚持使用elixir方面.当从C库(readline或只是普通scanf)读取输入时,"mix run -e"或"iex"似乎表现得有些奇怪(跳过或忽略某些输入),但无法找出原因.encurses似乎行为相似.

以下是我的试验.

https://github.com/parroty/ereadline

https://github.com/parroty/readline

我可能会采用像rlwrap这样的更通用的方法.

elixir

10
推荐指数
1
解决办法
1365
查看次数

标签 统计

elixir ×1