我想將整個字符串讀入一個列表,但沒有對它進行評估。跆拳道?是我無法做到的功能或功能組合。讀取字符串和加載字符串之間是否有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)
讀字符串只返回的第一個對象,而負載字符串返回它們,而是試圖對其進行評估。
我想將整個字符串讀入一個列表,但沒有對它進行評估。跆拳道?是我無法做到的功能或功能組合。讀取字符串和加載字符串之間是否有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)
讀字符串只返回的第一個對象,而負載字符串返回它們,而是試圖對其進行評估。
我是這樣一個noob。我很高興能夠了解安全閱讀,但似乎我的原始問題是通過在表單中添加()來解決的,而我在嘗試安全閱讀時做了一些不經意的事情。
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)
這是我用:
(defn safe-read
"Evaluate the string in a safe way"
[s]
(binding [*read-eval* false]
(read-string s)))
從DOC:
「當被設置成邏輯假,EvalReader(#=(...))在 殘疾人。在線程本地綁定實例讀/負載:
(binding [*read-eval* false] (read-string \"#=(eval (def x 3))\"))
所以它的作用是REA d像往常一樣,但禁用評估。
因此,您可以使用此功能讀取打印出來的地圖,列表和向量,而無需擔心評估惡意代碼。 (好吧,我確定這是安全的,但是對於日常的使用來說,它完成了這項工作)。
完美地工作,但它看起來像魔術。它如何使讀取字符串讀取所有對象? – dansalmo