1

我目前正在和The Little Schemer一起学习 Scheme,遇到了一个奇怪的麻烦。这是我的代码:

(define rember
  (lambda (a lat)
    ((if (null? lat)
         '()
         (cond
           ((eq? a (car lat)) (cdr lat))
           (else (rember a (cdr lat))))))))

(rember 'aaa '(bbb aaa))

我在教科书中使用了“if”而不是“cond”。从尾递归返回时,它显示此错误:

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: '()
  arguments...: [none]

我猜这是因为它将 if 语句中的 '() 视为一个函数,并将尾递归的返回值视为其参数。但是由于这本书没有给我太多关于语言的细节,你能帮我解释一下吗?(例如,这实际上是某种语言特性吗?有什么方法可以让我在这段代码中坚持使用“if”吗?什么时候可以安全地使用“if”?)

谢谢。

4

1 回答 1

6

你的 if 周围有一组额外的括号。这个

((if (null? lat)
     '()
      (cond
        ((eq? a (car lat)) (cdr lat))
        (else (rember a (cdr lat))))))

应该是这样的:

(if (null? lat)
    '()
     (cond
       ((eq? a (car lat)) (cdr lat))
       (else (rember a (cdr lat)))))

这些额外的括号告诉Scheme 你想调用if 的结果就像一个函数,所以你会得到一个错误,说'() 不是一个函数。

于 2013-10-13T02:16:32.523 回答