【问题标题】:How to define an function in the eshell (Erlang shell)?如何在 eshell(Erlang shell)中定义一个函数?
【发布时间】:2011-01-05 04:15:57
【问题描述】:

有什么方法可以在 Erlang shell 中而不是从 erl 文件(也称为模块)中定义 Erlang 函数?

【问题讨论】:

    标签: function erlang


    【解决方案1】:

    是的,但很痛苦。下面是一个“lambda 函数声明”(也就是 Erlang 术语中的 fun)。

    1> F=fun(X) -> X+2 end.
    %%⇒ #Fun <erl_eval.6.13229925>
    

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

    【讨论】:

    • 谢谢,成功了。你知道为什么函数不能像在 erl 文件中那样定义吗?是因为“评估”的代码不能“接收”吗? (我是 erlang 新手,所以如果我说的话听起来像胡言乱语,请纠正我)
    • 上面的例子真的是一个“lambda 函数声明”。看看我在回答中链接的文章:解释很广泛。
    • 我现在正在浏览这些链接。它开始有意义:)
    • 你可以把receive语句放在一个fun里面。
    • shell 进程是一个普通进程,带有一个可以向其发送消息的 Pid。您可以启动一个 Erlang 控制台并编写一个接收循环,然后从您生成的另一个进程或另一个 Erlang 节点发送到该进程。
    【解决方案2】:

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

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

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

    此外,从纯粹实用的角度来看,编译模块的速度如此之快,以至于在 shell 中定义函数几乎没有什么好处。

    【讨论】:

    • 能解释一下函数和表单的区别吗?
    • Form 是我们在模块文件中可以拥有的名称。因此,表单既是文件中的属性、-module()、-export() 等,也是函数定义。这些是 not 表达式,因为它们不被评估也不返回值。我们给它们命名形式以便将它们与表达式区分开来。
    【解决方案3】:

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

    https://erldocs.com/current/stdlib/shell_default.html

    【讨论】:

      【解决方案4】:

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

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

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

      定义一个匿名 fun,它绑定到变量(或标签)Sum。同时,下面定义了一个namedfun,称为F,用于创建一个PID(&lt;0.80.0&gt;)绑定到Pid的新进程。请注意,Freceive 的第二个子句中以尾递归方式调用,从而使进程能够循环,直到将消息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 中反复使用的 utility 函数。在这种情况下,我建议将user_default.erl 文件与.erlang 一起使用,以便在启动Erlang shell 后立即将这些自定义实用程序函数自动加载到Erlang shell 中。例如,您可以编写一个函数来编译当前目录中的所有 Erlang 文件。

      我在GitHub link 上写了一个关于如何做到这一点的小指南。您可能会发现它很有帮助和启发性。

      【讨论】:

        猜你喜欢
        • 2014-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-18
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        相关资源
        最近更新 更多