我想将整个字符串读入列表,但不评估它。跆拳道?是我无法做到的功能或功能组合。
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,但尝试评估它们。
答案 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)