3

文字列全体をリストに読み込みたいのですが、評価はしません。wtf?これを行うために私が見つけることができない機能または機能の組み合わせです。

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はそれらすべてを返しますが、それらを評価しようとします。

4

2 に答える 2

2

これは私が使用するものです:

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

ドキュメントから:

「論理falseに設定すると、EvalReader(#=(...))は、スレッドローカルバインディングの読み取り/ロードで無効になります。例:

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

したがって、通常どおり文字列を読み取りますが、評価を無効にします。

したがって、この関数を使用して、悪意のあるコードを評価することを恐れずに、印刷されたマップ、リスト、およびベクトルを読み取ることができます。(これが安全であると確信していますが、日常の使用ではそれが機能します)。

于 2012-09-02T17:12:29.403 に答える
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)
于 2012-09-02T17:46:50.027 に答える