【发布时间】:2016-08-01 16:55:10
【问题描述】:
如果我有一个这样的 lambda 表达式列表:
CL-USER> (DEFPARAMETER list-of-lambda-exp '(#'(lambda (x) x) #'(lambda (x) (* x x))))
那么我如何调用这个列表中的一个元素呢?
以下似乎不起作用:
CL-USER> (funcall (FIRST list-of-lambda-exp) 2)
给出错误
; Evaluation aborted on #<TYPE-ERROR expected-type: (OR FUNCTION SYMBOL) datum: #'(LAMBDA (X) X)>.
...这与在(first list-of-lambda-exp) 上对functionp 的调用一致。 (即使我删除了 lambda 表达式前面的#',上述情况也是如此。)
如何将(first list-of-lambda-exp) 改成函数?我似乎也无法弄清楚如何编写一个可以做到这一点的宏。我想我犯了一个愚蠢的错误,但找不到出路。
【问题讨论】:
-
您引用了列表。这意味着它包含恰好以符号
LAMBDA开头的子列表,而不是函数对象。您需要使用LIST而不是引号。 -
为了详细说明@jkiiski 的观点,
'(#'(lambda (x) x) #'(lambda (x) (* x x))))是列表(quote ((function (lambda (x) x)) (function (lambda (x) (* x x)))))。也就是说,请记住#'(lambda (x) ...)是(function (lambda (x) ...)的简写。您实际上可以将 list(lambda (x) ...)强制转换为一个函数,因此如果您的原始表单是'((lambda (x) ...) (lambda (x) ...)),而没有function部分,它会更容易一些。 -
谢谢!!我可以处理这个。出于好奇:如果列表确实被引用了怎么办?
-
@RanjitKumaresan 引用了列表,只是 lambda 表达式比您的代码预期的要深一层。
标签: list lambda macros common-lisp