如果我运行此代码
(defmacro foo
[expr]
(println "expr:" expr))
(foo '(1 2 3))
我将收到以下打印消息
expr: (quote (1 2 3))
但我希望收到以下消息
expr: '(1 2 3)
我想在defmacro中处理原始的阅读器宏字符串(在转换之前)。也许,我将通过读取使用宏的文件来访问该字符串并解析它,但不是那么酷。如果你知道上面提到的更好的方法,请告诉我。
提前致谢。
答案 0 :(得分:2)
根据http://www.clojure.org/reference/reader
读者的行为是由内置构造和称为读取表的扩展系统的组合驱动的。
和
用户程序当前无法访问读取表。
所以我说不。这与我从各种clojure书中记得的一致。
似乎可以保留的一件事是reader-conditionals
(read-string
{:read-cond :preserve}
"[1 2 #?@(:clj [3 4] :cljs [5 6])]")
;; [1 2 #?@(:clj [3 4] :cljs [5 6])]