【问题标题】:Lisp Flavored Erlang - Messaging primitivesLisp Flavored Erlang - 消息传递原语
【发布时间】:2009-11-24 22:07:20
【问题描述】:

我已经阅读了所有文档以及 LFE 的大部分来源。所有的演讲都强调传统 lisp 角色中的基本 lisp - 一般问题解决、Hello world 和语法模拟宏。

有人知道 LFE 如何处理消息原语吗?要指定一个更精确的问题,您将如何表达这个 erlang:

A = 2,  
Pid = spawn(fun()->  
    receive  
        B when is_integer(B) -> io:format("Added: ~p~n",[A+B]);  
        _ -> nan  
    end  
end), 
Pid ! 5.  

然后,你知道,它咕哝着一些数字相加,答案是 7。

【问题讨论】:

    标签: erlang lisp lfe


    【解决方案1】:

    我不是 LFE 用户,但源代码树中有一个 user guide。通过阅读它,我猜它是这样的:

    (let ((A 2))
      (let ((Pid (spawn (lambda ()
                          (receive
                            (B (when (is_integer B))
                              (: io format "Added: ~p~n" (list (+ A B))))
                            (_ nan))))))
        (! Pid 5)))
    

    但我很可能犯了错误,因为我什至没有在 LFE 中对其进行评估。

    我的一些问题:

    • 是否有 LET* 表单,或者它的行为已经像一个?
    • 守卫是不是像我写的那样被称为更 lispy is-integer 而不是 is_integer?

    【讨论】:

      【解决方案2】:

      LFE 版本中严重缺乏示例,欢迎所有贡献。

      Christian 的建议是正确的。我唯一的意见是,变量名不需要大写,没有错,但没有必要。

      LFE let 是一个“真正的”let,其中变量绑定首先在正文中可见。你可以在 let 中使用模式。还有一个let* 表单(实际上是宏)顺序绑定。

      不,到目前为止,我保留了所有 Erlang 核心函数名称,就像它们在 vanilla erlang 中一样。在名称中使用 - 而不是 _ 肯定更 lispy,但是您如何处理 OTP 中的所有其他函数名称和原子?一个建议是自动将 LFE 符号中的 - 映射到生成的原子中的 _,然后再返回当然是另一种方式。这可能会奏效,但会导致混乱吗?

      然后我可以有一个看起来像这样的行为模块:

      (defmodule foo
        (export (init 1) (handle-call 2) (handle-cast 2) (handle-info 2) ...)
        (behaviour gen-server))
      
      (defun handle-call ...)
      
      (defun handle-cast ...)
      
      etc ...
      

      但我对此很矛盾。

      【讨论】:

      • 这可能会导致混乱。想象一下,我们一直在告诉 Common Lisp 的用户原子名称不区分大小写,但读者只是在“实习”它们之前将原子大写。
      • 我的小经验是 lisp 和 erlang 之间的句法映射很快就从视图中消失了,这意味着编码人员会阅读 erlang 源代码并通过用括号替换逗号等方式进行心理翻译。我认为另一个重写标识符的步骤几乎每次都会让我感到困惑,因为我只想重写语法。我投票反对替换。
      猜你喜欢
      • 1970-01-01
      • 2016-04-30
      • 2017-08-27
      • 2011-08-27
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多