これで、厳密に言えば、 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 で戻り値の型を静的にディスパッチできますか?