clojure代码修改保留读者宏

时间:2015-08-27 13:32:43

标签: clojure macros

在clojure中,读取字符串后跟str不会返回原始字符串,而是扩展了读取器宏的字符串:

(str (read-string "(def foo [] #(bar))"))
;"(def foo [] (fn* [] (bar)))"

如果我们想要操作远离任何读取器宏的代码的一小部分,并且返回保留读取器宏的字符串表示,则这是有问题的。有工作吗?

1 个答案:

答案 0 :(得分:0)

read的目的是构建代码的AST,因此该函数不保留原始文本的所有属性。否则,它应该跟踪原始代码布局(例如括号,换行符,缩进(制表符/空格),注释等的位置)。如果您查看LispReader.java,可以看到无条件应用了阅读器宏(*read-eval*不会影响所有阅读器宏。)

以下是我的建议:

  • 您可以从现有的LispReader中获取灵感并实施自己的读者。也许只需更改调度表即可将宏字符指向您自己的读者。您还需要构建引用表单的运行时表示,并为这些对象提供足够的打印机功能。
  • 您可以使用Emacs lisp处理原始文件,该文件可以轻松导航代码结构并根据需要进行编辑。

备注:你必须知道你想要达到的味道是多么可疑。您可能有充分的理由想要这样做,但是如果不知道为什么您想要在语法级别工作,这看起来很复杂。如果您能提供更多详细信息,将会有所帮助。