现在我们知道 Clojure 协议上的调度,严格来说,是动态的。
我们在这里看到了一个使用宏进行编译时调度的绝妙示例:
(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 中对返回类型进行静态调度吗?