funcall函数错误无法取车lisp

时间:2016-01-10 12:15:50

标签: lisp common-lisp

此代码有什么问题?

(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".

出了什么问题?

1 个答案:

答案 0 :(得分:3)

以下是对@Sylwester评论的更详细解释,该评论正确回答了问题。

如果您编写(f '((1 2 3)),则调用函数fl绑定到((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)此时已绑定到l1应将内部函数f应用于(lambda (ff) (cond ...))的值但是,由于(f (car l))现在是l,该函数会尝试评估1,这会产生您找到的错误。