【发布时间】:2010-08-12 21:52:28
【问题描述】:
我有一个包含有效 Clojure 表单的字符串。我想替换它的一部分,就像 assoc-in 一样,但将整个字符串处理为标记。
=> (assoc-in [:a [:b :c]] [1 0] :new)
[:a [:new :c]]
=> (assoc-in [:a
[:b,, :c]] [1 0] :new)
[:a [:new :c]]
=> (string-assoc-in "[:a
[:b,, :c]]" [1 0] ":new")
"[:a
[:new,, :c]]"
我想写string-assoc-in。请注意,它的第一个和最后一个参数是字符串,并且保留了换行符和逗号。它在 Clojure 中可行吗?我找到的最接近的是read,它调用clojure.lang.LispReader,但我不知道它是如何工作的。
我想用它来读取一个 Clojure 源文件并显示它并进行一些修改,同时保持文件的结构。
【问题讨论】:
-
如果不编写您自己的阅读器,我想不出任何可靠的方法。
-
在我中听起来像是一个defmacro
-
@Paul Nathan:实际上,Lisp 宏具有与常规函数相同的字符串操作操作。正如保罗格雷厄姆所说,“整个语言始终存在”。 :-)
-
@Michal:是的,我知道。这个问题似乎有“lisp宏”的自然答案。但我对特定于 clojure 的 Lisp 了解不多,无法正确回答。
-
@Paul Nathan:嗯,Lisp 宏无法帮助您处理空格(在 Clojure 中,这包括逗号)。
标签: string syntax clojure replace tokenize