funcall函数错误无法获取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 ...))应用于(f (car l))的值,但是,由于l现在是1,该函数尝试评估(car 1),这会产生您发现的错误。

最新更新