如果两者都是向量,为什么我的函数在 Racket 中以不同的方式处理 (vector...) 和 '#(...)?



我第一次在Racket中使用向量。通常,我使用列表。

下面的现象引起了我的兴趣;符号";我得到:

> (vector? '#((cons 3 4) #f #f #f #f #f #f #f #f #f))
#t

如果我做同样的事情,但是用CCD_;预固定符号";我得到:

> (vector? (vector (cons 3 4) #f #f #f #f #f #f #f #f #f))
#t

现在,棘手的问题来了。我做了一个向量assoc,它类似于assoc(内置于列表(。这是我的功能:

(define (vector-assoc val vec)
(define (aux val vec counter)
(cond [(= (vector-length vec) counter) false] 
[(not (pair? (vector-ref vec counter))) (aux val vec (+ 1 counter))]
[(= val (car (vector-ref vec counter))) (vector-ref vec counter)]
[true (aux val vec (+ 1 counter))]))
(aux val vec 0))

当我用(vector...)调用vector assoc时,一切都很好:

> (vector-assoc 3 (vector (cons 3 4) #f #f #f #f #f #f #f #f #f))
'(3 . 4)

然而,当我使用'#(...)时,出现了一个问题:

> (vector-assoc 3 #'((cons 3 4) #f #f #f #f #f #f #f #f #f))
. . vector-length: contract violation
expected: vector?
given: #<syntax:interactions from an unsaved editor:17:20 ((cons 3 4) #f #f #f #f #f #f #f #f #f)>

为什么会发生这种情况?不应该是一样的吗?

引用(cons 3 4)就是(list 'cons 2 3)。使用准引号、非引号组合不在其上引号:

(vector-assoc 3 `#(,(cons 3 4) #f #f #f #f #f #f #f #f #f))

编辑:查看评论。

最新更新