Vector 为什么我的函数会处理(向量…)和'#(…)如果两者都是向量,球拍中会有不同吗?

Vector 为什么我的函数会处理(向量…)和'#(…)如果两者都是向量,球拍中会有不同吗?,vector,racket,Vector,Racket,我第一次在球拍中使用矢量。通常,我使用列表 下面的现象让我很感兴趣。如果我使用“#”符号调用REPL中的表达式,我得到: 如果我也这样做,但是使用(vector…作为“pre-fix notation”,我得到: 现在,棘手的问题来了。我做了一个向量assoc,它类似于assoc(列表内置)。这是我的职责: (define (vector-assoc val vec) (define (aux val vec counter) (cond [(= (vector-length vec

我第一次在球拍中使用矢量。通常,我使用列表

下面的现象让我很感兴趣。如果我使用“#”符号调用REPL中的表达式,我得到:

如果我也这样做,但是使用
(vector…
作为“pre-fix notation”,我得到:

现在,棘手的问题来了。我做了一个向量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)>
>(向量关联3#’((cons 3 4)f#f#f#f#f#f#f#f#f)
. . 向量长度:违反合同
预期:矢量?
鉴于:#
为什么会这样?这不应该是同一件事吗?

引用
(cons34)
(列出cons23)
。使用quasiquote、unquote组合不在其上引用:

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

编辑:参见注释。

”(cons 3 4)
不是
(列出cons 3 4)
<代码>列表是一个过程,总是计算其参数,因此在
列表
表单中
cons
是一个过程;在引用的形式中,
cons
是一个符号<代码>(car)(cons 3 4))-->
'cons
,但
(car(列表cons 3 4))
-->。IAC,在这样简单的情况下,最好只使用
向量
形式而不是准旋转。啊,是的,打字错误!我忘了在
cons
上加上报价。我已经编辑了答案。我同意,我更喜欢在这样简单的情况下使用向量形式,但我想展示这种组合,以澄清这个答案的概念。
> (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)>
(vector-assoc 3 `#(,(cons 3 4) #f #f #f #f #f #f #f #f #f))