关于类OR关键字的Clojure multimethod

Kon*_*rus 0 clojure multimethod

假设我有这种多方法

(defmulti m (fn [v] [(:type v)]))

(defmethod m [Object] [k] (prn "Object"))

(defmethod m [:mykwd] [k] (prn "mykwd"))
Run Code Online (Sandbox Code Playgroud)

当我用子类调用它时Object,它会正确地调度到第一个实现:

(m {:type String})
"Object"
Run Code Online (Sandbox Code Playgroud)

随着:mykwd它也按预期工作:

(m {:type :mykwd})
"mykwd"
Run Code Online (Sandbox Code Playgroud)

但当我提供另一个关键字时,我得到一个例外:

(m {:type :anotherkwd})
#<CompilerException java.lang.IllegalArgumentException: No method in multimethod 'm'
for dispatch value: [:anotherkwd] (NO_SOURCE_FILE:0)>
Run Code Online (Sandbox Code Playgroud)

这个调度究竟是如何工作的?

是否可以为类继承保留此行为,并且仍然具有捕获所有关键字的"默认"实现?

编辑这个例子很简单,但我需要它来处理二进制函数.我的真正需求如下.我不知道如何申请:default它.

(defmulti m (fn [arg mp] [(class arg) (:type mp)]))
Run Code Online (Sandbox Code Playgroud)

然后,我正在寻找一种方式,当定义它的情况argnil(:type mp)是什么.这适用于value for :type是一个类,但不适用于任何关键字:

(defmethod m [nil Object] [arg mp] (prn "Whatever"))
Run Code Online (Sandbox Code Playgroud)

Thi*_*Lam 5

有一个默认值:

(defmethod m :default [x] :oops)
Run Code Online (Sandbox Code Playgroud)

参考:

查看页面底部的http://clojure.org/multimethods.