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"?)
谢谢.
你的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函数的结果,所以你得到的错误是'()不是函数.