代码之家  ›  专栏  ›  技术社区  ›  yazz.com

在shell中定义erlang函数

  •  34
  • yazz.com  · 技术社区  · 15 年前

    是否有任何方法可以从erlang shell中而不是从erl文件定义erlang函数?

    4 回复  |  直到 6 年前
        1
  •  42
  •   jldupont    15 年前

    是的,但是很痛苦。下面是“lambda函数声明”(aka fun 以二郎的术语)。

    > F=乐趣(X)->X+2结束。

    #Fun <erl_eval.6.13229925>

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

        2
  •  14
  •   rvirding    15 年前

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

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

    模块是Erlang中的编译单元。它们也是代码处理的基本单元,即加载、更新或从系统中删除的整个模块。在这方面,一个接一个地单独定义函数并不符合事物的模式。

    另外,从纯实际的角度来看,编译一个模块的速度非常快,以至于能够在shell中定义函数几乎没有什么好处。

        3
  •  3
  •   Jonathan Ringstad    15 年前

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

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

        4
  •  0
  •   Duncan Paul    6 年前

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

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

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

    定义一个 匿名的 乐趣 绑定到变量(或标签)的 Sum . 同时,以下定义了 命名 乐趣 ,叫做 F ,用于创建一个新进程,其pid( <0.80.0> )势必 Pid . 注意 F 在的第二个子句中以尾部递归方式调用 receive ,使进程循环直到消息 stop 发送给它。

    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> 
    

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

    我写了一个关于如何做这个的小指南 GitHub link . 你可能会发现它有帮助和指导意义。

    推荐文章