Scheme 如何修复此错误:“quot;对象(1 3 5)不适用“;计划中

Scheme 如何修复此错误:“quot;对象(1 3 5)不适用“;计划中,scheme,lisp,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-pa

我是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)视为一个函数,但不知道如何修复它。谢谢。

您的代码中有一个
太多了。请查看第二个
,如果

((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)))

第5行的开括号太多。这意味着递归调用的返回值将被视为函数。的可能重复项。
(x y)
是函数调用。当您有
((if…)
时,您尝试调用任何
(if…
作为函数返回的内容。
(if…
返回
(1 3 5)
,您试图将其作为函数调用。顺便说一句,在Google上搜索
“对象”“不适用”网站:stackoverflow.com
发现了该重复项以及其他一些可能解决了您问题的项。这通常是一个很好的调试提示,可以通过特定的错误消息进行调试(但通常没有特定的数据(在本例中为
(1 3 5)
)首先进入搜索引擎)。