此代码有什么问题?
(defun f (l)
(funcall #'(lambda (ff)
(cond
((null l)nil)
((listp (car l)) (append ff (f (cdr l)) (car ff)))
(t (list (car l)))))
(f (car l))))
如果我输入(f'((1 2 3)),它会给我一个错误:
"Cannot take car of 1".
怎么了?
下面是对@Sylwester评论的更详细解释,它正确地回答了这个问题。
如果编写(f '((1 2 3))
,则调用函数f
,l
绑定到((1 2 3))
,结果是内部函数(lambda (ff) (cond ...))
应用于(f (car l))
的值。
为了执行该应用,首先对(f (car l))
进行评估以产生值,并且由于l
绑定到((1 2 3))
,所以其car
是(1 2 3)
。
因此,f
被应用于列表(1 2 3)
,该列表在递归调用中被绑定到l
。该评估再次意味着f
应当将内部函数(lambda (ff) (cond ...))
应用于(f (car l))
的值,即应用于(f 1)
。
获取过程,l
这次绑定到1
,f
应该再次将内部函数(lambda (ff) (cond ...))
应用于(f (car l))
的值,但是,由于l
现在是1
,该函数尝试评估(car 1)
,这会产生您发现的错误。