我刚从Stackoverflow上#=的帖子 "发现"了读取器宏,它解决了一个问题.这个读者宏观有多大可能成为该语言的官方(文档)部分?如何弃用或改变行为?
所述#=读取器宏导致以下s表达式由Lisp的读取器进行评估(宏膨胀之前).
我想打开给定对象的类以对其进行编码.
(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 "~"
)
)
Run Code Online (Sandbox Code Playgroud)
当我打电话时(encoded-msg-for {}),它会返回No matching clause: class clojure.lang.PersistentArrayMap
奇怪的是,将案例放入哈希映射(将类作为键和字符串作为值)非常有效.
也是的,(= (class {}) clojure.lang.PersistentArrayMap)是的.在这里进行了什么比较,我如何切换对象本身的类或(更好)在其层次结构中的某些东西?