在测试我传递给函数的对象是否是列表或向量时遇到问题

时间:2017-12-14 23:56:00

标签: scheme racket

我不确定我做错了什么,我无法理解我的结果

以下是 DrRacket

中的代码
(define (checkType . x)
  (cond
    [(vector? x) (display "x is a vector")]
    [(list? x) (display "x is a list")]      
    [#t (newline)]
  ))

输出(REPL):

> (checkType (make-vector 3 #(1 2 3)))
x is a list

> (checkType (make-vector 3 #(1 2 3)))
x is a list

> (vector? (make-vector 3 #(1 2 3)))
#t

> (list? (make-vector 3 #(1 2 3)))
#f

这就是我的问题所在。

当我传入向量时,为什么它不显示"x is a vector"?事实上,当我传入一个向量时,它甚至会通过检查它是否为列表的条件。难道这不会发生并跳到最后一个表达式吗?如输出中所示,make-vector创建向量而不是列表。

我是否误解了某事的语义?

1 个答案:

答案 0 :(得分:1)

为什么在.参数之前有一个x点?拿出来。 .表示x将被视为“varargs”rest参数,该列表包含所有其余参数。取.x将成为正常参数。

(define (checkType x)
  (cond
    [(vector? x) (displayln "x is a vector")]
    [(list? x) (displayln "x is a list")]      
    [else (newline)]))