Lisp Flavored Erlang - 通信基元

9
我已经阅读了所有文档和大部分 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的话。

2个回答

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)))

但由于我甚至没有在 LFE 中评估它,所以很可能犯了错误。

我的一些问题:

  • 是否有一个 LET* 表单或者它已经像一个 LET* 表单一样工作了?
  • 卫语句是否被称为更加 Lisp 风格的 is-integer 而不是我写的 is_integer?

5

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用户原子名称不是大小写不敏感的,而是读取器仅在“interning”它们之前将它们大写。 - Christian
我的小经验是,Lisp和Erlang之间的语法映射很快就会消失在视野中,这意味着程序员将阅读Erlang源代码,并通过用括号替换逗号等方式进行心理翻译。我认为另一个重写标识符的步骤几乎每次都会让我困扰,因为我只会寻求重写语法。我反对这种替换。 - Chris Hagan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接