我们可以在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

现在我们知道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中使用宏静态地分派返回类型吗?

理论上,您可以使用宏来构建具有Haskell类型语义的Clojure DSL,所以严格来说是可能的

然而,从实际的角度来看,在编译类型上分配返回类型意味着使这些信息可用并在编译时传播。Clojure中没有内置的“返回类型”(所有函数都接受数量可变的对象类型参数并返回一个对象),因此您可能必须推出自己的类型系统,并需要大部分程序参与其中(a la),使用宏时,类型分析必须立即可用


case+
(双关语)的情况有所不同,因为它不需要类型系统,主要是一个求值顺序问题。

这个
case*
宏与这个问题有什么关系?它在编译时生成一个构造。这是一个非运行时Clojure调度。