Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在clojure的全局映射中追加值_Clojure - Fatal编程技术网

在clojure的全局映射中追加值

在clojure的全局映射中追加值,clojure,Clojure,我在clojure中使用 (def finalMap {}) 我在使用assoc的函数中向其追加值,但它们没有追加,映射仍然为空。我认为这是由于不变性,我可以通过某种方式使全局映射可变。该函数是递归函数,每次调用该函数时我都会附加值 (defn func [arg1 arg2] ;(map append inside let) (dorun (for [i (range 0 index)]

我在clojure中使用

             (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中必须有一种方法来实现这一点他没有使用可变映射。