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