如何在clojure中维护2d向量的单个副本

如何在clojure中维护2d向量的单个副本,clojure,Clojure,我想在全班维护vector的一个副本。我必须在递归中多次更新向量 ;this is to update cell in vector (defn to-plus [data x y] (update data y (fn [row] (apply str (assoc (vec row) x \+))))) ;here i am getting values in board and calling to-plus to update board ;now i need to mainta

我想在全班维护vector的一个副本。我必须在递归中多次更新向量

 ;this is to update cell in vector
(defn to-plus [data x y]
 (update data y (fn [row] (apply str (assoc (vec row) x \+)))))

;here i am getting values in board and calling to-plus to update board
;now i need to maintain a single copy of board
(let [board (read-in-board "map.txt")]
(print-maze board)
(println(str (get-in board [1 4])))
(print-maze (to-plus board 1 4))
(println(to-plus board 1 4))) 
我试图用递归和随机游走来解决迷宫问题。我对Clojure不熟悉

;Data is of type 
---#--###----
-#---#----##-
####-#-#-#-##
---#---#-#---
-+-####---##-
-#------#----
-############
------------@
使用to-array-2d,然后使用aget和aset

以上答案已被L.F.否决,并在下面添加了更多细节:

“…维护向量的单个副本…” Ans:使用to-array-2d将不可变嵌套向量转换为可变2d数组

“…在递归中多次更新向量…”
Ans:使用aget和aset读取和更新创建的可变2d数组。

如果需要更新紧循环中的某些内容,可以使用瞬态向量。它们被设计为从单个Java线程变异而来,并在从函数返回之前转换为持久数据结构。它们纯粹是针对持久向量的性能优化。首先让你的算法工作,然后引入瞬变使其更快。

正如其他人已经回答的那样,Clojure向量是不可变的。你有几个选择

使用瞬态向量。 使用原子。 使用瞬态,您的代码将如下所示

(let [maze (transient [\* \* \* \*])]
  (assoc! maze
          1
          \#)
  (prn (persistent! maze)))
(let [maze (atom [\* \* \* \*])]
  (prn @maze)
  (swap! maze
         assoc
         1
         \#)
  (prn @maze))
使用atom,您的代码将如下所示

(let [maze (transient [\* \* \* \*])]
  (assoc! maze
          1
          \#)
  (prn (persistent! maze)))
(let [maze (atom [\* \* \* \*])]
  (prn @maze)
  (swap! maze
         assoc
         1
         \#)
  (prn @maze))
这张照片

=> [\* \* \* \*]
=> [\* \# \* \*]
请注意,当使用原子时,内部向量仍然是不可变的。每次都要用新向量交换向量。因此,如果性能是您唯一关心的问题,请使用transient

如果要更新深度嵌套的结构,请查看中的assoc。

不行。Clojure向量是不可变的。您可以使用Java样式的数组。Clojure具有以下帮助函数:[make array][可以制作您想要的。您可以使用aget和某种形式的aset操纵arrray。。。。