2009-11-24 6 views
9

Ich habe die gesamte Dokumentation gelesen, und die meisten der Quelle von LFE. Alle Präsentationen betonen das grundlegende Lispeln in traditionellen Lisp-Rollen - General Problem Solving, Hello World und Syntax, die Makros emulieren.Lisp Flavored Erlang - Messaging primitiven

Kann jemand wissen, wie LFE Messaging-Primitiven behandelt? Um eine genauere Frage zu geben, wie würden Sie drücken diese erlang:

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

Und dann, weißt du, murmelt er etwas darüber, dass einige Zahlen addiert und die Antwort sein 7.

Antwort

7

Ich bin nicht ein LFE-Benutzer, aber im Quellbaum befindet sich ein user guide. Aus der Lektüre würde ich denke, es ist so etwas wie dieses:

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

Aber ich bin sehr wahrscheinlich einen Fehler gemacht zu haben, da ich es nicht einmal in LFE ausgewertet.

Einige Fragen von mir:

  • Gibt es eine LET* Form oder ist es wie ein bereits verhalten?
  • Werden Wachen mehr Lispy is-Integer und nicht is_integer wie ich schrieb genannt?
5

Es gibt einen ernsten Mangel an Beispielen in der LFE-Veröffentlichung, alle Beiträge sind willkommen.

Christian Vorschlag ist richtig. Mein einziger Kommentar ist, dass es keine Notwendigkeit gibt, Variablennamen groß zu schreiben, es ist nicht falsch, aber nicht notwendig.

Das LFE let ist ein "echtes" Let, in dem die variablen Bindungen zuerst im Körper sichtbar sind. Sie können Muster in Let verwenden. Es gibt auch eine let* Form (Makro tatsächlich), die sequentiell bindet.

Nein, ich habe bisher alle Erlang-Kernfunktionsnamen beibehalten, so wie sie in Vanille erlang sind. Es ist definitiv lispy, - anstelle von _ in Namen zu verwenden, aber was machen Sie mit allen anderen Funktionsnamen und Atomen in OTP? Ein Vorschlag ist, in den resultierenden Atomen automatisch - in LFE-Symbolen auf _ abzubilden und natürlich wieder in die andere Richtung zu gehen. Das würde wahrscheinlich funktionieren, aber würde es zu Verwirrung führen?

(defmodule foo 
    (export (init 1) (handle-call 2) (handle-cast 2) (handle-info 2) ...) 
    (behaviour gen-server)) 

(defun handle-call ...) 

(defun handle-cast ...) 

etc ... 

Aber ich bin sehr ambivalent es:

Ich konnte dann ein Verhaltensmodul wie der Blick haben.

+0

Es würde wahrscheinlich zu Verwirrung führen. Stellen Sie sich die ganze Zeit vor, in der Benutzer von Common Lisp darüber informiert wurden, dass bei Atomnamen nicht zwischen Groß- und Kleinschreibung unterschieden wird, sondern dass der Leser nur Atome in den Vordergrund stellt, bevor er sie "interniert". – Christian

+0

Meine kleine Erfahrung ist, dass die syntaktische Zuordnung zwischen Lisp und Erlang sehr schnell aus der Sicht verschwindet, was bedeutet, dass ein Kodierer die Erlang-Quelle liest und sie mental übersetzt, indem er Kommas durch Klammern ersetzt. Ich denke, ein weiterer Schritt beim Umschreiben von Identifikatoren würde mich stolpern fast jedes Mal, da ich nur die Syntax neu schreiben wollte. Ich stimme gegen die Substitution. –