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))
那么调用函数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 ...))
应用到 [=15 的值=],但是,由于 l
现在是 1
,该函数会尝试计算 (car 1)
,这会产生您发现的错误。
这段代码有什么问题?
(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 ...))
应用到 [=15 的值=],但是,由于 l
现在是 1
,该函数会尝试计算 (car 1)
,这会产生您发现的错误。