如何找出阅读器宏的作用?
例如,我知道正则表达式#"abc"
与(re-pattern "abc")
相同。
但是下面的代码:(macroexpand #"abc" )
返回结果为#"abc"
,那么我如何从阅读器特殊形式转换为“普通”函数形式呢?
如何找出阅读器宏的作用?
例如,我知道正则表达式#"abc"
与(re-pattern "abc")
相同。
但是下面的代码:(macroexpand #"abc" )
返回结果为#"abc"
,那么我如何从阅读器特殊形式转换为“普通”函数形式呢?
您可以使用read-string
查找读取器扩展的内容:
(read-string "`(rest ~f)")
=>
(clojure.core/seq
(clojure.core/concat (clojure.core/list (quote clojure.core/rest)) (clojure.core/list f)))
(read-string "#(x %&)")
=> (fn* [& rest__92046#] (x rest__92046#))
(read-string "`(~@x)")
=> (clojure.core/seq (clojure.core/concat x))
(read-string "`(~x)")
=> (clojure.core/seq (clojure.core/concat (clojure.core/list x)))
(read-string "'map")
=> (quote map)
(read-string "#'map")
=> (var map)
(read-string "@x")
=> (clojure.core/deref x)
(binding [*print-meta* true]
(pr-str (read-string "(def ^:foo x 'map)")))
=> "(def ^{:foo true} x (quote map))"
(read-string "#\"x\"")
=> #"x"
然而,在您的情况下:正则表达式以同样的方式打印回来,因为这就是它在Clojure中的打印方式。
(class #"abc")
=> java.util.regex.Pattern
macroexpand
完全做到同样的效果:(macroexpand '\
(rest ~f)),那么为什么还要费心去使用
read-string`呢? - leetwinski