我写了一段代码,创建了一个矢量“记分板”,其中包含3个大小为3的单独矢量,所有矢量都包含符号?在所有索引0-2。当我现在执行“向量集!”时在计分板的第一个向量上,要将其第一个元素更改为'X,向量2和3也将更改。这是怎么发生的?
(define scoreboard (make-vector 3 (make-vector 3 '?)))
(define (display-scoreboard)
(display (vector-ref scoreboard 0))
(newline)
(display (vector-ref scoreboard 1))
(newline)
(display (vector-ref scoreboard 2))
(newline))
(define (X! pos)
(cond
((>= 3 pos) (vector-set! (vector-ref scoreboard 0) (- pos 1) 'X))
))
(display-scoreboard)
(X! 1)
(newline)
(display-scoreboard)
输出:
#(? ? ?)
#(? ? ?)
#(? ? ?)
#(X ? ?)
#(X ? ?)
#(X ? ?)
所需的输出:
#(? ? ?)
#(? ? ?)
#(? ? ?)
#(X ? ?)
#(? ? ?)
#(? ? ?)
答案 0 :(得分:5)
Differences between String-Based and Functor-Based Connections
该图像显示(make-vector 3 (make-vector 3 '()))
创建了一个向量
在所有三个插槽中都具有相同的行(向量)。
输入(vector (vector '() '() '()) (vector '() '() '()) (vector '() '() '()))
。
或做一些辅助功能:
(define (make-row) (vector '() '() '()))
(vector (make-row) (make-row) (make-row))
答案 1 :(得分:4)
除了@soegaard的出色回答,我想指出的是,创建向量的非共享向量的惯用方式是使用build-vector
。
;; ignore i and j since we want all elements to be the same
> (define table (build-vector 3 (lambda (i) (build-vector 3 (lambda (j) '?)))))
> table
'#(#(? ? ?) #(? ? ?) #(? ? ?))
;; this will mutate only one row
> (vector-set! (vector-ref table 0) 0 42)
> table
'#(#(42 ? ?) #(? ? ?) #(? ? ?))
;; we can use i and j to make different elements for each index
> (build-vector 3 (lambda (i) (build-vector 3 (lambda (j) (* (add1 i) (add1 j))))))
'#(#(1 2 3) #(2 4 6) #(3 6 9))