Lisp Flavored Erlang - Messaging原语

Chr*_*gan 9 lisp erlang lfe

我已经阅读了所有文档和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.  
Run Code Online (Sandbox Code Playgroud)

然后,你知道,它总结了一些关于添加了一些数字而答案是7的东西.

Chr*_*ian 7

我不是LFE用户,但源树中有一个用户指南.从阅读它我会猜这是这样的:

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

但我很可能犯了一个错误,因为我甚至没有在LFE中评估它.

我的一些问题:

  • LET*表格还是表现得像?
  • 卫兵被称为更多lispy是整数而不是我写的is_integer?


rvi*_*ing 5

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

克里斯蒂安的建议是正确的.我唯一的评论是没有必要使用大写的变量名,这没有错,但没有必要.

LFE 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 ...
Run Code Online (Sandbox Code Playgroud)

但我对此非常矛盾.