在shell中定义erlang函数

Zub*_*air 35 erlang function

有没有办法从Erlang shell中而不是从erl文件中定义Erlang函数?

jld*_*ont 43

是的,但很痛苦.下面是"lambda函数声明"(又名funErlang术语).

1 >F = fun(X) - > X + 2 end.

#Fun <erl_eval.6.13229925>

看看这篇文章.如果您需要,您甚至可以输入模块的声明价值.换句话说,是的,您可以声明函数.

  • shell进程是一个普通的进程,可以使用Pid发送消息.您可以启动Erlang控制台并编写接收循环,并从您生成的另一个进程或另一个Erlang节点发送到该进程. (4认同)

rvi*_*ing 14

一个答案是shell只评估表达式,函数定义不是表达式,它们是表单.在erl文件中,您定义表单而不是表达式.

所有函数都存在于模块中,除了函数定义之外,模块由属性组成,更重要的是模块名称以及从中导出的函数.只能从其他模块调用导出的函数.这意味着必须先定义模块,然后才能定义函数.

模块是erlang中的编译单元.它们也是代码处理的基本单元,即它是从系统加载,更新或删除的整个模块.在这方面,一个一个地单独定义功能不适合于事物的方案.

此外,从纯粹实用的角度来看,编译模块的速度非常快,以至于能够在shell中定义函数的收益很少.

  • Form是我们在模块文件中可以拥有的名称.因此,表单既是文件中的属性,-module(), - export()等,也是函数定义.这些不是**表达式,因为它们不被评估,也不返回值.我们给了他们名字表格,以便将他们从表达中删除. (3认同)

Dun*_*aul 5

这取决于您实际需要做什么。

有些函数可以被视为“一次性”,即定义一次来执行测试,然后继续。在这种情况下,fun将使用该语法。虽然有点麻烦,但是可以用来快速有效地表达事物。例如:

1> Sum = fun(X, Y) -> X + Y end.
#Fun<erl_eval.12.128620087>
2> Sum(1, 2).
3
Run Code Online (Sandbox Code Playgroud)

定义绑定到变量(或标签)的匿名者 。同时,下面定义了一个命名的,称为,用于创建一个新进程,其 PID( ) 绑定到。请注意,在 的第二个子句中以尾递归方式调用,使进程能够循环,直到消息发送给它。funSum funF<0.80.0>PidFreceivestop

3> Pid = spawn(fun F() -> receive stop -> io:format("Stopped~n"); Msg -> io:format("Got: ~p~n", [Msg]), F() end end). 
<0.80.0>
4> Pid ! hello.
hello
Got: hello
5> Pid ! stop.
Stopped
stop
6> 
Run Code Online (Sandbox Code Playgroud)

然而,您可能需要定义某些您打算在 Erlang shell 中反复使用的实用函数。在这种情况下,我建议使用该user_default.erl文件,.erlang以便在启动后立即将这些自定义实用程序函数自动加载到 Erlang shell 中。例如,您可以编写一个函数来编译当前目录中的所有 Erlang 文件。

我已经在此GitHub 链接上编写了有关如何执行此操作的小指南。您可能会发现它很有帮助且有启发性。