【问题标题】:clojure code modification preserving reader macrosclojure 代码修改保留阅读器宏
【发布时间】:2015-08-27 13:32:43
【问题描述】:

在clojure中,read-string后跟str不会返回原始字符串,而是返回reader宏扩展后的字符串:

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

如果我们想要操作一小部分代码,远离任何阅读器宏,并获取保留阅读器宏的字符串表示形式,这是有问题的。有解决办法吗?

【问题讨论】:

    标签: clojure macros


    【解决方案1】:

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

    以下是我的建议:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多