gpt4 book ai didi

erlang - 使用 Erlang 在 LFE 解释器中绑定(bind)的值

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:18 27 4
gpt4 key购买 nike

我想将 Lisp Flavored Erlang 用作 Erlang 应用程序的脚本扩展语言如果您愿意,可以在类似的方式GNU Emacs通过 Emacs Lisp 配置和扩展.

我知道这个论点广泛而有条理;但在这个问题的特定情况下,我希望能够从 Erlang 代码中读取 LFE 中定义的绑定(bind)名称(或变量,如果您愿意)。

我不是LFE的专家内部架构(这是软件工程和 Erlang 编程的一个很好的例子),但我无法在源代码和文档中找到答案。看着sources我可以看到 LFE 包含一个目标为 Erlang VM编译器和一名口译员。后者是我正在尝试使用的。

如果我在 LFE 安装路径中启动 Erlang shell/REPL(在我的系统上 $HOME/opt/lfe ):


$ 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

这是第一步,但不是我想要的。我宁愿绑定(bind)一个变量并读取它的值;那是我的问题:


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被识别为未绑定(bind)函数?在 LFE REPL 中,这个表达式是有效的:

Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:4:4] ...LFE Shell V6.4 (abort with ^G)> (set a 10)10> a10

我显然以错误的方式使用了 API。 我怎样才能阅读 a 的内容?和/或正确初始化LFE 解释器

(如果某处对此有解释,请提供引用)。

最佳答案

我不会尝试完全回答您关于添加脚本的“最佳实践”的更广泛的问题。在我看来,在“基于钩子(Hook)”的解决方案(其中您通过名称约定定义钩子(Hook)实现并且它们被自动识别)和“显式 api”解决方案(其中您使用脚本环境中预定义的函数来注册您的钩子(Hook))之间进行选择或以其他方式调用配置函数)在很大程度上是个人喜好问题。像 (set-connection-timeout-handler ...) 这样的显式调用可能更具可读性、更容易调试(没有拼写错误问题、api 更改没有意外)、更容易记录、更灵活一点,但更多,嗯,明确的。

从您的简单变量定义示例开始,您可以通过以下几种方式开始进一步“解释”路径:

1> {ok, Expr} = lfe_io:read_string("'((a 10))").
{ok,[quote,[[a,10]]]}
2> lfe_eval:expr (Expr).
[[a,10]]

3> EvalAll = fun (Conf) -> {ok, E} = lfe_io:read_string("'(" ++ Conf ++ ")"), lfe_eval:expr(E) end.
#Fun<erl_eval.6.90072148>
4> EvalAll ("(a 10) (b 11)").
[[a,10],[b,11]]

5> EvalAllL = fun (Conf) -> {ok, E} = lfe_io:read_string("(list " ++ Conf ++ ")"), lfe_eval:expr(E) end.
#Fun<erl_eval.6.90072148>
6> [{f, F}] = EvalAllL ("(tuple 'f (lambda (x) (+ 10 x)))").
[{f,#Fun<lfe_eval.12.2018457>}]
7> F (12).
22

8> G = fun (X) -> X * 2 end.
#Fun<erl_eval.6.90072148>
9> lfe_eval:expr (element (2, lfe_io:read_string ("(g 15)")), lfe_eval:add_lexical_func(g, 1, G, lfe_env:new ())).
30

关于erlang - 使用 Erlang 在 LFE 解释器中绑定(bind)的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30636588/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com