【发布时间】:2016-07-08 13:24:13
【问题描述】:
现在我们知道了 Clojure 协议上的调度,strictly speaking, is dynamic。
我们在这里看到了 compile-time dispatch 使用宏的绝佳示例:
(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))))
这里是the writer argues,您将永远无法在 Clojure 中根据返回类型进行调度。对我来说,似乎有了足够强大的宏,你可以做任何事情。
我的问题是:我们可以使用宏在 Clojure 中静态调度返回类型吗?
【问题讨论】:
-
这个
case*宏与问题有什么关系? -
它在编译时生成一个构造。它是一个非运行时 Clojure 调度。
标签: clojure macros dispatch static-dispatch