Common lisp 应用从函数列表中选择的函数

Common lisp 应用从函数列表中选择的函数,common-lisp,Common Lisp,我想从函数列表中进行选择。并对参数应用choosen函数 (defvar fn '(#'(lambda (x) (* x x)) #'(lambda (x) (+ x x)))) 上面的代码不起作用有什么问题?fn不是函数列表。由于您引用了该列表,因此不会计算任何函数表达式。所以你只需要一系列的函数LAMBDA X 使用list创建列表并计算所有参数: (defvar fn (list #'(lambda (x) (* x x)) #'(lambda (x) (+ x x)))) 或者使用

我想从函数列表中进行选择。并对参数应用choosen函数

 (defvar fn '(#'(lambda (x) (* x x)) #'(lambda (x) (+ x x))))
上面的代码不起作用有什么问题?

fn不是函数列表。由于您引用了该列表,因此不会计算任何函数表达式。所以你只需要一系列的函数LAMBDA X

使用list创建列表并计算所有参数:

(defvar fn (list #'(lambda (x) (* x x)) #'(lambda (x) (+ x x))))
或者使用反引号和逗号:

(defvar fn `(,#'(lambda (x) (* x x)) ,#'(lambda (x) (+ x x))))
fn不是一个函数列表。由于您引用了该列表,因此不会计算任何函数表达式。所以你只需要一系列的函数LAMBDA X

使用list创建列表并计算所有参数:

(defvar fn (list #'(lambda (x) (* x x)) #'(lambda (x) (+ x x))))
或者使用反引号和逗号:

(defvar fn `(,#'(lambda (x) (* x x)) ,#'(lambda (x) (+ x x))))

如果使用Lisp,则可以交互式地浏览这些数据结构:

CL-USER 50 > '(#'(lambda (x) (* x x)) #'(lambda (x) (+ x x)))
((FUNCTION (LAMBDA (X) (* X X)))
 (FUNCTION (LAMBDA (X) (+ X X))))
以上是一份清单。这些元素是什么类型的:

CL-USER 51 > (mapcar #'type-of *)
(CONS CONS)
CL-USER 52 > (mapcar #'eval **)
(#<anonymous interpreted function 40600010FC>
 #<anonymous interpreted function 406000112C>)
上面说的元素不是功能,而是cons单元

我们现在评估列表元素:

CL-USER 51 > (mapcar #'type-of *)
(CONS CONS)
CL-USER 52 > (mapcar #'eval **)
(#<anonymous interpreted function 40600010FC>
 #<anonymous interpreted function 406000112C>)

如果使用Lisp,则可以交互式地浏览这些数据结构:

CL-USER 50 > '(#'(lambda (x) (* x x)) #'(lambda (x) (+ x x)))
((FUNCTION (LAMBDA (X) (* X X)))
 (FUNCTION (LAMBDA (X) (+ X X))))
以上是一份清单。这些元素是什么类型的:

CL-USER 51 > (mapcar #'type-of *)
(CONS CONS)
CL-USER 52 > (mapcar #'eval **)
(#<anonymous interpreted function 40600010FC>
 #<anonymous interpreted function 406000112C>)
上面说的元素不是功能,而是cons单元

我们现在评估列表元素:

CL-USER 51 > (mapcar #'type-of *)
(CONS CONS)
CL-USER 52 > (mapcar #'eval **)
(#<anonymous interpreted function 40600010FC>
 #<anonymous interpreted function 406000112C>)
lambda x*x'lambda x+x x是一个带引号的表达式。fn是示例中的符号列表

实际上,您希望将lambda计算为函数,以便删除引号并写入:

defvar*fn*列出λx*xλx+x 现在,每个函数对象确实可以用作参数:

应用车辆*fn*列表3 => 9 也存在。通过阅读HyperSpec,看看你是否能理解它与HyperSpec的区别。你可以这样称呼它:

funcall cadr*fn*3 => 6 lambda x*x'lambda x+x x是一个带引号的表达式。fn是示例中的符号列表

实际上,您希望将lambda计算为函数,以便删除引号并写入:

defvar*fn*列出λx*xλx+x 现在,每个函数对象确实可以用作参数:

应用车辆*fn*列表3 => 9 也存在。通过阅读HyperSpec,看看你是否能理解它与HyperSpec的区别。你可以这样称呼它:

funcall cadr*fn*3 => 6
Barmar,非常感谢,我必须想一想,但它奏效了:-你的回答,对我来说,完全正确,鉴于我目前有限的CL知识:-Barmar,非常感谢,我必须想一想,但它奏效了:-你的回答,对我来说,完全正确,鉴于我目前有限的CL知识:-谢谢。我的神经元现在连接得更好了。他们现在意识到这个名单。。。与“……确实不一样。当您需要编写自评估对象的常量列表时,使用quote是合法的。请参见CLHS。数字和字符串是自计算对象的示例,但计算为数字或字符串的表达式则不是。所以=3车'3和字符串=aaa车'aaa都是真的。谢谢。我的神经元现在连接得更好了。他们现在意识到这个名单。。。与“……确实不一样。当您需要编写自评估对象的常量列表时,使用quote是合法的。请参见CLHS。数字和字符串是自计算对象的示例,但计算为数字或字符串的表达式则不是。So=3 car'3和string=aaa car'aaa都是真的。