read-string和load-string之间是否有clojure函数?

时间:2012-09-02 17:07:15

标签: string list clojure

我想将整个字符串读入列表,但不评估它。跆拳道?是我无法做到的功能或功能组合。

user=> (wtf?  " S  I I ( S I I)")
(S I I (S I I))

该功能也应该如下:

user=> (last (wtf?  " S  I I ( S I I)"))
(S I I)

read-string只返回第一个对象,而load-string返回all,但尝试评估它们。

2 个答案:

答案 0 :(得分:2)

这就是我使用的:

(defn safe-read
  "Evaluate the string in a safe way"
  [s]
  (binding [*read-eval* false]
    (read-string s)))

来自doc:

  

“设置为逻辑false时,禁用EvalReader(#=(...))   线程局部绑定中的读取/加载。示例:

(binding [*read-eval* false] (read-string \"#=(eval (def x 3))\"))

所以它的作用是像往常一样读取字符串,但禁用评估。

因此,您可以使用此功能读取打印出的地图,列表和向量,而无需担心评估恶意代码。 (好的,我确定这是安全的,但是对于日常使用它可以完成这项工作)。

答案 1 :(得分:2)

我是一个菜鸟。我很高兴找到安全阅读,但似乎我的原始问题是通过在表单周围添加()来解决的,我在尝试安全阅读时无意中这样做了。

user=> (read-string  "( S  I I ( S I I))")
(S I I (S I I))

user=> (last (read-string  "( S  I I ( S I I))"))
(S I I)