2012-09-02 108 views
3

我想將整個字符串讀入一個列表,但沒有對它進行評估。跆拳道?是我無法做到的功能或功能組合。讀取字符串和加載字符串之間是否有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) 

讀字符串只返回的第一個對象,而負載字符串返回它們,而是試圖對其進行評估。

回答

2

我是這樣一個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) 
2

這是我用:

(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像往常一樣,但禁用評估。

因此,您可以使用此功能讀取打印出來的地圖,列表和向量,而無需擔心評估惡意代碼。 (好吧,我確定這是安全的,但是對於日常的使用來說,它完成了這項工作)。

+0

完美地工作,但它看起來像魔術。它如何使讀取字符串讀取所有對象? – dansalmo

相關問題