2009-11-24 33 views
9

我已经读过所有文档以及LFE的大部分源代码。所有演讲都强调传统lisp角色中的基本lisp - 一般问题解决,Hello world和语法模拟宏。Lisp Flavored Erlang - 消息传递原语

有谁知道LFE如何处理消息传递原语?要指定一个更精确的问题,你会怎么表达这种二郎:

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

然后,你知道,这喃喃上发布了一些数字,答案是7

回答

7

我不是东西一个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?
5

LFE版本中存在严重缺失的例子,欢迎所有贡献。

Christian的建议是正确的。我唯一的评论是,没有必要拥有大写的变量名,它没有错,但没有必要。

LFE let是一个“真正的”让其中变量绑定首先在身体中可见。你可以在let中使用模式。还有一个let*窗体(实际上是宏),它依次绑定。

不,我到目前为止保留了所有Erlang核心函数名称,就像它们在vanilla erlang中一样。在名称中使用-而不是_肯定更加清晰,但是您如何处理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 ... 

但我对此非常矛盾。

+0

这可能会导致混淆。设想一直花费在告知Common Lisp的用户原子名称不区分大小写,但读者只是在将它们“interning”之前大写原子。 – Christian 2009-11-25 14:41:07

+0

我的一个小经验是lisp和erlang之间的语法映射从视图中很快就消失了,这意味着编码器会读取erlang源代码并通过括号替换逗号等方式来精神转换它。我认为重写标识符的另一个步骤会使我绊倒几乎每一次,因为我只想着重写语法。我反对替代。 – 2009-11-26 00:55:26