【发布时间】:2015-06-04 06:34:21
【问题描述】:
我想使用 Lisp Flavored Erlang 作为 脚本扩展语言 用于 Erlang 应用程序。如果您愿意,可以使用类似的方式GNU Emacs通过Emacs Lisp配置和扩展。
我知道这个论点是广泛而有条理的;但在这个问题的特定情况下,我希望能够从 Erlang 代码中读取 LFE 中定义的 绑定名称(或变量,如果您愿意的话)。
我不是 LFE 内部架构的专家(这是软件工程和 Erlang 编程的一个很好的例子),但我在源代码和资源中都找不到答案在文档中。 查看sources,我可以看到LFE 包含一个针对Erlang VM 的编译器 和一个解释器。 后者是我正在尝试使用的。
如果我在 LFE 安装路径(在我的系统 $HOME/opt/lfe)中启动 Erlang shell/REPL:
$ cd /path/to/LFE-install-dir
$ erl -pa ./ebin
我能够计算出一个值:
1> {ok, Expr} = lfe_io:read_string("(+ 1 10)").
{ok,['+',1,10]}
2> Result = lfe_eval:expr(Expr).
11
这是第一步,但不是我想要的。我宁愿绑定一个变量并读取它的值;那是我的问题:
3> {ok, Expr2} = lfe_io:read_string("(set a 10)").
{ok,[set,a,10]}
4> lfe_eval:expr(Expr2).
** exception error: {unbound_func,{set,2}}
in function lfe_eval:eval_expr/2
为什么set 被识别为未绑定函数?在 LFE REPL 中,这个表达式是有效的:
我显然是以错误的方式使用 API。 我如何才能阅读 a 的内容和/或正确初始化 LFE 解释器? p>
(如果在某处有解释,请提供参考)。
【问题讨论】:
-
原因是
set是一个shell命令,它在shell之外是不存在的。通常在 LFE 代码中,您使用let、case,lambda,match-lambda` 或其他有模式匹配的地方绑定变量。你能举一个更好的例子来说明你想如何使用它吗? -
+1 感谢您的澄清。我正在学习各种 Lisp,发现 LFE 是 Erlang 生态系统中最有趣的原因。现在我正在尝试各种想法,但基本上我希望能够将该系统用作 Erlang 应用程序的配置 DSL。假设我的应用程序是一个服务器,我希望 connection timeout 在我的 config.lfe 中进行外部处理,那么最好的方法是什么?我应该定义一个
get-conn-timeout函数并读取其结果还是更好地从 Erlang 创建一个set_conn_timeout并将其附加到为读取配置而创建的 LFE 会话中? -
由于这个问题在 LFE google 小组帖子 中被引用,我认为这对于那些对这些论点感兴趣的人可能会很有用,从这里链接回小组线程。 Lisp Flavored Erlang > LFE configuration script, LCFG and the likes.