在shell中定义erlang函数

时间:2010-01-14 17:09:16

标签: function erlang

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

4 个答案:

答案 0 :(得分:43)

是的,但很痛苦。下面是“lambda函数声明”(在Erlang术语中称为fun)。

  

1 > F = fun(X) - > X + 2结束。

     

#Fun <erl_eval.6.13229925>

看看这个post。如果需要,您甚至可以输入module's worth of declaration。换句话说,是的,你可以声明函数。

答案 1 :(得分:14)

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

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

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

另外,从纯粹实用的角度来看,编译模块的速度非常快,以至于无法在shell中定义函数。

答案 2 :(得分:3)

如果你想在shell上定义一个函数来将它用作宏(因为它封装了你经常需要的一些功能),请看看

http://erldocs.com/R13B04/stdlib/shell_default.html

答案 3 :(得分:0)

这取决于您实际需要执行的操作。

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

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

定义绑定到变量(或标签)fun匿名 Sum。同时,以下定义了名为fun F,用于创建PID(<0.80.0>)绑定到{{1 }}。请注意,在Pid的第二子句中,以尾部递归的方式调用F,使过程可以循环直到消息receive发送到它为止。

stop

但是,您可能需要定义打算在Erlang shell中反复使用的某些实用程序函数。在这种情况下,我建议将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> 文件与user_default.erl一起使用,以便在启动后将这些自定义实用程序功能自动加载到Erlang Shell中。例如,您可以编写一个函数来编译当前目录中所有的Erlang文件。

我已经在GitHub link上写了一个小指南。您可能会发现它很有帮助和指导意义。