为什么我的函数在 Racket 中以不同的方式对待 (vector...) 和 '#(...) 如果两者都是向量?
Why my function treats (vector...) and '#(...) differently in Racket if both are vectors?
我第一次在 Racket 中使用向量。通常,我使用列表。
下面的现象让我很感兴趣。如果我使用 '# "notation" 在 REPL 中调用表达式,我得到:
> (vector? '#((cons 3 4) #f #f #f #f #f #f #f #f #f))
#t
如果我这样做但使用 (vector...)
作为“前缀符号”,我得到:
> (vector? (vector (cons 3 4) #f #f #f #f #f #f #f #f #f))
#t
现在,棘手的一点来了。我做了一个类似于 assoc 的 vector-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)
。使用 quasiquote,unquote 组合不引用它:
(vector-assoc 3 `#(,(cons 3 4) #f #f #f #f #f #f #f #f #f))
编辑:查看评论。
我第一次在 Racket 中使用向量。通常,我使用列表。
下面的现象让我很感兴趣。如果我使用 '# "notation" 在 REPL 中调用表达式,我得到:
> (vector? '#((cons 3 4) #f #f #f #f #f #f #f #f #f))
#t
如果我这样做但使用 (vector...)
作为“前缀符号”,我得到:
> (vector? (vector (cons 3 4) #f #f #f #f #f #f #f #f #f))
#t
现在,棘手的一点来了。我做了一个类似于 assoc 的 vector-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)
。使用 quasiquote,unquote 组合不引用它:
(vector-assoc 3 `#(,(cons 3 4) #f #f #f #f #f #f #f #f #f))
编辑:查看评论。