为什么我的函数在 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))

编辑:查看评论。