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