此代码有什么问题?
(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".
出了什么问题?
答案 0 :(得分:3)
以下是对@Sylwester评论的更详细解释,该评论正确回答了问题。
如果您编写(f '((1 2 3))
,则调用函数f
,l
绑定到((1 2 3))
,结果是内部函数{{1}的应用} {到(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
,这会产生您找到的错误。