scheme - 如何修复此错误 : "The object (1 3 5) is not applicable" in Scheme

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

最佳答案

你的代码中有一个(太多了。看看第二个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)))

关于scheme - 如何修复此错误 : "The object (1 3 5) is not applicable" in Scheme,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24244002/

相关文章:

macos - Mac OS X 是否带有内置于 Emacs 的 Lisp 环境?

lisp - Common Lisp 中的 str_replace?

lambda - 通过程序执行的说明

scala - 无法使用静态语言创建应用函数?

scope - 方案 - 动态作用域和无限循环

scheme - 如何从 Racket 列表中过滤掉错误值

tree - 打开音乐 : L-System tree generation using lisp

macros - 将其翻译成 Common Lisp

scheme - 如何在 Racket 中安装 sicp 包模块?

clojure - 编辑程序 "while they are running"?为什么?