我正在处理一些数据并在最后使用了 interpose。但是当涉及到一些字母时,它的表现就不一样了,` ~
预期行为
(interpose '! ["a" "b" "c"])
=> ("a" ! "b" ! "c")
(interpose 'k ["a" "b" "c"])
=> ("a" k "b" k "c")
(interpose '- ["a" "b" "c"])
=> ("a" - "b" - "c")
Run Code Online (Sandbox Code Playgroud)
非预期行为(它们返回函数而不是数据结果)
(interpose ', ["a" "b" "c"])
=> #object[clojure.core$interpose$fn__6471 0x6f0c27f3 "clojure.core$interpose$fn__6471@6f0c27f3"]
(interpose '` ["a" "b" "c"])
=> #object[clojure.core$interpose$fn__6471 0x7b94fbcb "clojure.core$interpose$fn__6471@7b94fbcb"]
(interpose '~ ["a" "b" "c"])
=> #object[clojure.core$interpose$fn__6471 0x36966945 "clojure.core$interpose$fn__6471@36966945"]
Run Code Online (Sandbox Code Playgroud)
这些字符在 Clojure 中都有特殊的含义,你不能只用引号输入它们。因此,读者会根据其含义处理它们,然后您的'引用将用于下一个表单。这一切都会导致代码调用 的单元版本interpose,然后它会给你一个转换器,从而产生你看到的函数作为结果。
如果要将这些字符作为符号,可以使用symbol. 例如
user=> (interpose (symbol ",") ["a" "b" "c"])
("a" , "b" , "c")
Run Code Online (Sandbox Code Playgroud)
这些字符的含义是:
具有意外行为的结果代码基本上如下所示:
user=> `(interpose ', ["a" "b" "c"])
(clojure.core/interpose (quote ["a" "b" "c"]))
user=> `(interpose '` ["a" "b" "c"])
(clojure.core/interpose (quote (clojure.core/apply clojure.core/vector (clojure.core/seq (clojure.core/concat (clojure.core/list "a") (clojure.core/list "b") (clojure.core/list "c"))))))
user=> `(interpose '~ ["a" "b" "c"])
(clojure.core/interpose (quote ["a" "b" "c"]))
Run Code Online (Sandbox Code Playgroud)