有没有一种从defmacro获取读者宏字符串的简单方法?

时间:2016-08-03 10:23:18

标签: clojure

如果我运行此代码

(defmacro foo
  [expr]
  (println "expr:" expr))

(foo '(1 2 3))

我将收到以下打印消息

expr: (quote (1 2 3))

但我希望收到以下消息

expr: '(1 2 3)

我想在defmacro中处理原始的阅读器宏字符串(在转换之前)。也许,我将通过读取使用宏的文件来访问该字符串并解析它,但不是那么酷。如果你知道上面提到的更好的方法,请告诉我。

提前致谢。

1 个答案:

答案 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])]