Теперь мы знаем, что отправка по протоколам Clojure, static">строго говоря, является динамическим.
Здесь мы видим фантастический пример компиляции. диспетчеризация времени с помощью макроса:
(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
~@(concat (->> clauses
(map #(-> % first eval-dispatch (list (second %))))
(mapcat identity))
default))))
Здесь автор утверждает, который вы никогда не сможете отправить по возвращаемому типу в Clojure. Мне кажется, что с достаточно мощным макросом можно сделать все что угодно.
Мой вопрос: Можем ли мы использовать макросы для статической диспетчеризации возвращаемого типа в Clojure?
case*
имеет к вопросу? - person amalloy   schedule 09.07.2016