在clojure中,读取字符串后跟str不会返回原始字符串,而是扩展了读取器宏的字符串:
(str (read-string "(def foo [] #(bar))"))
;"(def foo [] (fn* [] (bar)))"
如果我们想要操作远离任何读取器宏的代码的一小部分,并且返回保留读取器宏的字符串表示,则这是有问题的。有工作吗?
答案 0 :(得分:0)
read
的目的是构建代码的AST,因此该函数不保留原始文本的所有属性。否则,它应该跟踪原始代码布局(例如括号,换行符,缩进(制表符/空格),注释等的位置)。如果您查看LispReader.java,可以看到无条件应用了阅读器宏(*read-eval*
不会影响所有阅读器宏。)
以下是我的建议:
LispReader
中获取灵感并实施自己的读者。也许只需更改调度表即可将宏字符指向您自己的读者。您还需要构建引用表单的运行时表示,并为这些对象提供足够的打印机功能。备注:你必须知道你想要达到的味道是多么可疑。您可能有充分的理由想要这样做,但是如果不知道为什么您想要在语法级别工作,这看起来很复杂。如果您能提供更多详细信息,将会有所帮助。