如何修复此错误:"对象(1 3 5)不适用n#34;在Scheme中

时间:2014-06-16 12:41:24

标签: scheme lisp

我是Scheme的新手,我现在正在学习SICP。我为练习2.20编写了一些代码,以返回一个列表,其元素与第一个元素共享相同的奇偶校验:

(define (same-parity first . rest)
    (define (same-parity-iter ret rest)
        (if (null? rest)
            ret
            ((if (odd? (+ first (car rest)))
                 (same-parity-iter ret (cdr rest))
             (same-parity-iter (append ret (list (car rest))) (cdr rest))))))
    (same-parity-iter (list first) (cdr rest)))

并使用一些示例运行它:

(same-parity 1 2 3 4 5)

然后出现错误:

The object (1 3 5) is not applicable.

您知道如何解决此错误吗?我猜它将返回值(1 3 5)视为一个函数,但不知道如何修复它。谢谢。

1 个答案:

答案 0 :(得分:0)

您的代码中有(太多了。看看第二个if

((if (odd? (+ first (car rest)))
     (same-parity-iter ret (cdr rest))
     (same-parity-iter (append ret (list (car rest))) (cdr rest)))))

基本上,你是在告诉解释器(或编译器):取结果

(if (odd? (+ first (car rest)))
     (same-parity-iter ...)
     (same-parity-iter ...))

并将其应用为函数。结果是一个整数列表,它不是一个函数 - 因此是错误。将代码更改为

(define (same-parity first . rest)
  (define (same-parity-iter ret rest)
    (if (null? rest)
        ret
        (if (odd? (+ first (car rest)))
            (same-parity-iter ret (cdr rest))
            (same-parity-iter (append ret (list (car rest))) (cdr rest)))))
    (same-parity-iter (list first) (cdr rest)))