方案if语句

bab*_*l92 1 lisp scheme the-little-schemer racket

我正在和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))
Run Code Online (Sandbox Code Playgroud)

我在教科书中使用了"if"而不是"cond".从尾递归返回时,它显示以下错误:

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

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

谢谢.

Dav*_*vid 6

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

((if (null? lat)
     '()
      (cond
        ((eq? a (car lat)) (cdr lat))
        (else (rember a (cdr lat))))))
Run Code Online (Sandbox Code Playgroud)

应该这样:

(if (null? lat)
    '()
     (cond
       ((eq? a (car lat)) (cdr lat))
       (else (rember a (cdr lat)))))
Run Code Online (Sandbox Code Playgroud)

这些额外的括号告诉Scheme你想调用if函数的结果,所以你得到的错误是'()不是函数.