我们可以在Clojure中使用宏对返回类型进行静态分派吗?
现在我们知道Clojure协议上的调度 我们在这里看到一个使用宏的极好示例:我们可以在Clojure中使用宏对返回类型进行静态分派吗?,clojure,macros,dispatch,static-dispatch,Clojure,Macros,Dispatch,Static Dispatch,现在我们知道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
(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中使用宏静态地分派返回类型吗?理论上,您可以使用宏来构建具有Haskell类型语义的Clojure DSL,所以严格来说是可能的 然而,从实际的角度来看,在编译类型上分配返回类型意味着使这些信息可用并在编译时传播。Clojure中没有内置的“返回类型”(所有函数都接受数量可变的对象类型参数并返回一个对象),因此您可能必须推出自己的类型系统,并需要大部分程序参与其中(a la),使用宏时,类型分析必须立即可用
case+
(双关语)的情况有所不同,因为它不需要类型系统,主要是一个求值顺序问题。这个case*
宏与这个问题有什么关系?它在编译时生成一个构造。这是一个非运行时Clojure调度。