funcall函数报错cannot take car lisp

funcall function error cannot take car 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".

怎么了?

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

如果你写(f '((1 2 3))那么调用函数fl绑定到((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 这次绑定到 1f 应该再次将内部函数 (lambda (ff) (cond ...)) 应用到 [=15 的值=],但是,由于 l 现在是 1,该函数会尝试计算 (car 1),这会产生您发现的错误。