1

(defmulti multi (fn [t] (cond (seq? t) :seq (map? t) :map (vec? t) :vec ...私はあちこちでたくさんのClojureコードのパターンを読みました。これは基本的にスイッチです(タイプを追加する場合は、新しい句を追加する必要があります)が、より冗長です。言う方法などはありません(defmethod seq, (defmethod vec (defmethod map..か?それは非常に一般的なことであるに違いありません。階層を手動で定義することは可能ですが、シーケンス、ベクトル、マップなどの一般的なClojureタイプについてはどうでしょうか...タイプでディスパッチされたプログラムごとに定義する必要がありますか?私がポイントを逃している方法を教えてください!

編集:わかりました、(defmulti mymulti type)それなら言うことができると思い(defmethod clojure.lang.PeristantSomething...ましたが、Javaクラスを参照しているので不器用ですが、シーケンシャルかアソシアティブかなど、「タイプ」の品質を参照したいと思います

4

2 に答える 2

3

タイプでのディスパッチは、これに適しています。

user> (import '[clojure.lang Associative Sequential])
user> (defmulti foo type)
#'user/foo

user> (defmethod foo Associative [x] :map)
#<MultiFn clojure.lang.MultiFn@7e69a380>

user> (foo {:x 1})
:map
user> (foo ())
; fails, a list is not associative

user> (defmethod foo Sequential [x] :seq)
#<MultiFn clojure.lang.MultiFn@7e69a380>
user> (foo ())
:seq
user> (foo [])
; fails, a vector is both sequential and associative

user> (prefer-method foo Sequential Associative)
#<MultiFn clojure.lang.MultiFn@7e69a380>
user> (foo [])
:seq

SequentialとAssociativeはどちらもインターフェースであり、具象クラスではないことに注意してください。

于 2012-06-09T06:01:01.803 に答える
0

ディスパッチされた関数はタイプまたはクラスを選択します。

于 2012-06-09T05:44:32.557 に答える