【发布时间】:2013-07-17 11:00:42
【问题描述】:
这个问题并没有真正解释我想做什么,但我想不出别的。
我在一段代码的外部let 函数中有一个空映射,还有一个整数数组。
我想遍历整数数组,执行一个简单的任务,并不断将结果映射附加到外部变量中的变量。
(let [a {} ;outer variables
b {}]
(doseq [x [1 2 3]]
(let [r (merge a {x (* x x)}) ;I want to append this to a
s (merge b {x (+ x x)})] ;and this to b
(println (str "--a--" r "--b--" s)))))
但是一旦我离开doseq,我的a 和b 变量仍然是空的。我知道 a 和 b 的范围并没有扩展到doseq 之外,因为它可以保留从内部完成的任何更改,并且它们是不可变的。
请问在这种情况下如何计算 a 和 b 的值?我试图将doseq的功能提取到另一个函数中并调用let:
(let [a (do-that-function)])
等等,但即便如此,我还是想不出一种方法来跟踪doseq循环中的所有修改,然后作为一个整体发回。
我是否以错误的方式处理这个问题?
谢谢
编辑
真的,我想做的是:
(let [a (doseq [x [1 2 3]] {x (* x x)})]
(println a))
但是 doseq 返回 nil 所以 a 将是 nil :-s
【问题讨论】:
-
作为一个迂腐点,clojure 中没有变量。符号绑定到值。该值不会改变,因此不是可变的(但符号可以在不同的上下文中绑定到不同的值)。 atom 和 refs 之类的东西可以像变量一样起作用。
标签: clojure