这些嵌套向量如何连接?

时间:2019-06-30 12:41:44

标签: 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)

输出:

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

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

所需的输出:

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

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

2 个答案:

答案 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))