这些嵌套向量如何连接?

Tur*_*sun 3 scheme racket r5rs

我编写了一段代码,创建了一个矢量“记分板”,其中包含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)
Run Code Online (Sandbox Code Playgroud)

输出:

#(? ? ?)
#(? ? ?)
#(? ? ?)

#(X ? ?)
#(X ? ?)
#(X ? ?)
Run Code Online (Sandbox Code Playgroud)

所需的输出:

#(? ? ?)
#(? ? ?)
#(? ? ?)

#(X ? ?)
#(? ? ?)
#(? ? ?)
Run Code Online (Sandbox Code Playgroud)

soe*_*ard 5

在此处输入图片说明

该图像显示(make-vector 3 (make-vector 3 '()))创建了一个在所有三个插槽中都具有相同行(向量)的向量。

相反,写(vector (vector '() '() '()) (vector '() '() '()) (vector '() '() '()))。或做一些辅助功能:

(define (make-row) (vector '() '() '()))
(vector (make-row) (make-row) (make-row))
Run Code Online (Sandbox Code Playgroud)