Оператор случая Clojure с классами

Я хочу включить класс данного объекта, чтобы закодировать его.

(defn encoded-msg-for [msg]
  (case (class msg)
    java.lang.Double   (encode-double msg)
    java.lang.String   (encode-str msg)
    java.lang.Long   (encode-int msg)
    java.lang.Boolean  (encode-bool msg)
    clojure.lang.PersistentArrayMap (encode-hash msg)
    clojure.lang.PersistentVector (encode-vec msg)
    nil "~"
  )
 )

Когда я вызываю (encoded-msg-for {}), он возвращаетNo matching clause: class clojure.lang.PersistentArrayMap

Странно то, что помещение случаев в хэш -карту (с классами в качестве ключей и строками в качестве значений )работает отлично.

Также верно (= (class {}) clojure.lang.PersistentArrayMap). Какое сравнение здесь происходит и как я могу переключить либо класс самого объекта, либо (лучше )что-то в его иерархии?

9
задан Chris 19 August 2012 в 18:34
поделиться