2016-07-08 29 views
1

Jetzt wissen wir, dass Versand auf Clojure Protokolle, strictly speaking, is dynamic.Können wir Makros verwenden, um einen Rückgabetyp in Clojure statisch zu versenden?

Wir sehen hier ein fantastisches Beispiel für compile-time dispatch mit einem Makro:

(defmacro case+ 
    "Same as case, but evaluates dispatch values, needed for referring to 
    class and def'ed constants as well as java.util.Enum instances." 
    [value & clauses] 
    (let [clauses (partition 2 2 nil clauses) 
     default (when (-> clauses last count (== 1)) 
        (last clauses)) 
     clauses (if default (drop-last clauses) clauses) 
     eval-dispatch (fn [d] 
         (if (list? d) 
          (map eval d) 
          (eval d)))] 
    `(case ~value 
     [email protected](concat (->> clauses 
        (map #(-> % first eval-dispatch (list (second %)))) 
        (mapcat identity)) 
      default)))) 

Hier the writer argues, die Sie nie auf Rückgabetyp in Clojure entsenden können. Mir scheint, dass man mit einem ausreichend starken Makro alles machen kann.

Meine Frage ist: Können wir Makros verwenden, um auf einen Rückgabetyp in Clojure statisch zu versenden?

+1

Was hat dieses 'case *' Makro mit der Frage zu tun? – amalloy

+0

Es erzeugt ein Konstrukt zur Kompilierzeit. Es ist ein Nicht-Laufzeit-Clojure-Versand. – hawkeye

Antwort

0

Theoretisch können Sie Makros verwenden, um eine Clojure DSL mit Haskell-Typ-Semantik zu erstellen, also genau genommen ist es möglich.

Vom praktischen Standpunkt aus gesehen, bedeutet das Senden auf Rückgabetyp beim Kompilieren jedoch, dass diese Informationen verfügbar gemacht und zur Kompilierungszeit propagiert werden. Es gibt keinen eingebauten 'Rückgabetyp' in Clojure (alle Funktionen akzeptieren eine variable Anzahl von Object-typed Argumenten und geben ein Objekt zurück), so dass Sie wahrscheinlich Ihr eigenes Typsystem einführen müssen und große Teile Ihrer Programme benötigen Nehmen Sie daran teil (à la Type Clojure), mit der Einschränkung, dass die Typanalyse verfügbar sein muss, sobald Sie Ihr Makro verwenden.

Der Fall von case+ (Wortspiel beabsichtigt) ist anders, weil es kein Typsystem erfordert, es ist meistens eine Frage der Bewertungsreihenfolge.