在clojure的全局映射中追加值
我在clojure中使用在clojure的全局映射中追加值,clojure,Clojure,我在clojure中使用 (def finalMap {}) 我在使用assoc的函数中向其追加值,但它们没有追加,映射仍然为空。我认为这是由于不变性,我可以通过某种方式使全局映射可变。该函数是递归函数,每次调用该函数时我都会附加值 (defn func [arg1 arg2] ;(map append inside let) (dorun (for [i (range 0 index)]
(def finalMap {})
我在使用assoc的函数中向其追加值,但它们没有追加,映射仍然为空。我认为这是由于不变性,我可以通过某种方式使全局映射可变。该函数是递归函数,每次调用该函数时我都会附加值
(defn func [arg1 arg2]
;(map append inside let)
(dorun (for [i (range 0 index)]
(do
(func(arg1 arg2))))))
你能帮我找到正确的方法吗?如果你想要一个可变的映射,那么你应该创建一个原子:
(def final-map (atom {}))
通常,您还可以使用assoc
向其中添加更多的键值对。但是,您需要使用swap代码>只是为了能够调用assoc
:
(swap! final-map assoc :a "a value")
这将添加一个键/值对,其中键是关键字:a
,值是字符串“a value”
看看其他的可能会更好。请注意,在上面的代码中,assoc
将以final map
的旧值作为第一个参数进行调用,并返回final map
的新值 是的,谢谢。我使用ref也做了同样的事情。它现在可以工作了。你可以用一个原子编写整个应用程序。如果你只有一个原子,那么就没有必要使用ref:see-并且意识到作者不需要使用两个原子-他/她可以将原子作为一个带有两个键/值对的映射。哦,我会研究它。谢谢。另外一件需要考虑的事情是总是伸手去拿映射
(就像你尝试过的那样)当你想多次做某事时。考虑<代码>(map Inc(范围10))< /代码>。解决这个问题的方法是使用<代码>原子< /代码>,如答案中所建议的。更重要的是你的最终目标是什么?您能提供函数将在其中使用的上下文吗?也许有一个更好的解决方案,不涉及可变数据。顺便说一下:(dorun(用于[i(范围0索引)])…
可以缩短为(dotimes[i索引]由于do*
宏的主体是在隐式do
块中计算的,所以do
和do
内部dorun
已经过时了。实际上,我刚开始使用clojure,正在将java代码转换为clojure。我以与java中相同的方式实现了此函数。显然,clojure中必须有一种方法来实现这一点他没有使用可变映射。