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。

4

2 回答 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*形式,或者它已经表现得像一个形式?
  • 警卫被称为更 lispy is-integer 而不是我写的 is_integer 吗?
于 2009-11-25T05:01:46.730 回答
5

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

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

LFElet是一个“真正的”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 ...

但我对此非常矛盾。

于 2009-11-25T14:09:37.917 回答