2017-06-14 5 views
0

のためでは動作しません、このコードはうまく働いていたと私はそれ負荷-stringはREPLにループ

にループのため導入されたとき、それは動作しないだろうが答え36

(do 
    (load-string (str "(def yyy" 2 " 18)")) 
    (* 2 yyy2)) 

を与えます

(do 
(for [x [1 2 3]] 
    (load-string (str "(def yyyy" x " 18)"))) 
(* 2 yyyy2)) 

エラーは、ロード・ストリング内で定義されているはずのシンボルyyyy2を解決できませんでした。何人かの専門家が私の理由を説明できますか?ありがとう!

答えて

1

forはレイジーシーケンスを生成します。したがって、あなたが評価を強制するまで、load-stringの表現は評価されません。 fordorunまたはdoallにラップして強制することができます。

副作用のみが必要な場合は、doseqを使用するか、数字の範囲を繰り返し処理する必要がある場合は、dotimesも便利です。

+1

'dorun'や' doall'に 'for'を入れるのではなく、' for'を['doseq'](https://clojuredocs.org/clojure.core/doseq)に置き換えてください。 –

+0

ありがとう!それは動作します。 –

+0

@SamEstepあなたが正しいです - 私は私の答えを編集しました。ありがとう! –