List 从引用的lambda表达式列表调用函数

List 从引用的lambda表达式列表调用函数,list,lambda,macros,common-lisp,List,Lambda,Macros,Common Lisp,如果我有一个lambda表达式列表,如下所示: CL-USER> (DEFPARAMETER list-of-lambda-exp '(#'(lambda (x) x) #'(lambda (x) (* x x)))) 那么我如何在这个列表中的一个元素上使用funcall呢 以下内容似乎不起作用: CL-USER> (funcall (FIRST list-of-lambda-exp) 2) 给出了错误 ; Evaluation aborted on #<TYPE-ERRO

如果我有一个lambda表达式列表,如下所示:

CL-USER> (DEFPARAMETER list-of-lambda-exp '(#'(lambda (x) x) #'(lambda (x) (* x x))))
那么我如何在这个列表中的一个元素上使用funcall呢

以下内容似乎不起作用:

CL-USER> (funcall (FIRST list-of-lambda-exp) 2)
给出了错误

; Evaluation aborted on #<TYPE-ERROR expected-type: (OR FUNCTION SYMBOL) datum: #'(LAMBDA (X) X)>. 

;对#的评估中止这里发生了两种情况。首先,请记住,quote,可以用缩写。返回未计算的参数。然后,记住#“函数的缩写。也就是说,#'(lambda(x))(function)(lambda(x)…)的简写,而不仅仅是列表的变体(lambda(x))。因此:

CL-USER> (quote ((function (lambda (x) x)) (function (lambda (x) (* x x)))))
;=> (#'(LAMBDA (X) X) #'(LAMBDA (X) (* X X)))
因此,您可以进入列表中的多个级别以获得实际的lambda表达式(仅是一个以lambda开头的列表),然后将其放入一个可以调用的函数中:

CL-USER> (let ((fs '(#'(lambda (x) x) #'(lambda (x) (* x x)))))
           (list (funcall (coerce (second (first fs)) 'function) 42)
                 (funcall (coerce (second (second fs)) 'function) 8)))
;=> (42 64)

这里发生了两种事情。首先,请记住,quote,可以用缩写。返回未计算的参数。然后,记住#“函数的缩写。也就是说,#'(lambda(x))(function)(lambda(x)…)的简写,而不仅仅是列表的变体(lambda(x))。因此:

CL-USER> (quote ((function (lambda (x) x)) (function (lambda (x) (* x x)))))
;=> (#'(LAMBDA (X) X) #'(LAMBDA (X) (* X X)))
因此,您可以进入列表中的多个级别以获得实际的lambda表达式(仅是一个以lambda开头的列表),然后将其放入一个可以调用的函数中:

CL-USER> (let ((fs '(#'(lambda (x) x) #'(lambda (x) (* x x)))))
           (list (funcall (coerce (second (first fs)) 'function) 42)
                 (funcall (coerce (second (second fs)) 'function) 8)))
;=> (42 64)

你引用了名单。这意味着它包含恰好以符号
LAMBDA
开头的子列表,而不是函数对象。你需要使用
LIST
而不是quote。为了详细说明@jkiiski的观点,
'(#'(lambda(x)x)#'(lambda(x)(*x)))
是列表
(quote((function(lambda(x)x))(function(lambda(x)(*x)!))
。也就是说,请记住
#'(lambda(x))
(function)(lambda(x)…)
的简写。实际上,您可以将列表
(lambda(x)…)
强制为一个函数,因此如果您的原始形式是
”(lambda(x)…(lambda(x)…)(lambda(x)…)
,没有
函数部分。谢谢!!我可以处理这个问题。出于好奇:如果列表确实被引用了怎么办?@RanjitKumaresan列表被引用了,只是lambda表达式比代码预期的要深一层。你引用了列表。这意味着它包含恰好以符号
LAMBDA
,而不是函数对象。您需要使用
LIST
而不是quote。要详细说明@jkiiski的观点,
'(#'(LAMBDA(x)x)#'(LAMBDA(x)(*x))
是列表
(quote((函数(LAMBDA(x)x))(函数(LAMBDA(x)(*x))))
。也就是说,请记住
#'(lambda(x))
(function)(lambda(x)…)
的简写。实际上,您可以将列表
(lambda(x)…)
强制为一个函数,因此如果您的原始形式是
”(lambda(x)…(lambda(x)…)(lambda(x)…)
,没有
函数部分。谢谢!!我可以处理这个问题。出于好奇:如果这个列表被引用了怎么办?@RanjitKumaresan这个列表被引用了,只是lambda表达式比你的代码预期的要深一层。谢谢你的解释!!也有可能这样做
(list#'(lambda…
而不是
)(lambda…
会是更好的选择。我想你是想提到这一点的,基于你的“因此,你可以选择其中一个…”,但看起来那一段好像漏掉了。谢谢你的解释!!也有可能这样做
(列出#)(lambda…
而不是
)(#(lambda…
会是更好的选择。我想你是想提到这一点的,基于你的“因此,你可以选择……”,但看起来那一段似乎被遗漏了。