2017-06-14 46 views
0
工作,

在REPL,该代码工作得很好,给出的答案36负载串不适合循环

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

而当我介绍了一个for循环到它

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

错误提示无法解析符号yyyy2,该符号应该在加载字符串中定义。有些专家可以解释我的原因吗?谢谢!

回答

1

for产生懒惰序列从而load-string表达不会被评估,直到迫使其评价。您可以通过将for包含在dorundoall中强制执行此操作。

对于只需要副作用的情况下,您应该使用doseq或者当您只需要遍历一系列数字时dotimes也可能非常方便。

+1

而不是包装'for'在'dorun'或'doall',你应该只用['doseq'(https://clojuredocs.org/clojure.core/doseq)代替'for'。 –

+0

谢谢你!这样可行。 –

+0

@SamEstep你说得对 - 我编辑了我的答案。谢谢! –