我目前正在与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”?)
谢谢。
最佳答案
您的 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 的结果,所以你会得到错误提示 '() 不是函数。
关于方案 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19341125/