2009-11-24 75 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