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?
Was hat dieses 'case *' Makro mit der Frage zu tun? – amalloy
Es erzeugt ein Konstrukt zur Kompilierzeit. Es ist ein Nicht-Laufzeit-Clojure-Versand. – hawkeye