我第一次在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))
编辑:查看评论。