如何在Scheme中使用列表中的lambda

如何在Scheme中使用列表中的lambda,lambda,scheme,lisp,higher-order-functions,mit-scheme,Lambda,Scheme,Lisp,Higher Order Functions,Mit Scheme,我在弄清楚如何使用Scheme中列表中包含的lambda时遇到了一些问题。例如,我有以下代码: (define abc '((lambda (x) (* x x)))) 我想从列表中选取第一个lambda,并将其应用于一些数字。以下是我到目前为止的情况: (map (car abc) '(1 2 3)) 但是,我得到以下错误: ;The object (lambda (x) (* x x)) is not applicable. 但是,当我直接使用lambda尝试相同的方法时,它会起作用:

我在弄清楚如何使用Scheme中列表中包含的lambda时遇到了一些问题。例如,我有以下代码:

(define abc '((lambda (x) (* x x))))
我想从列表中选取第一个lambda,并将其应用于一些数字。以下是我到目前为止的情况:

(map (car abc) '(1 2 3))
但是,我得到以下错误:

;The object (lambda (x) (* x x)) is not applicable.
但是,当我直接使用lambda尝试相同的方法时,它会起作用:

(map (lambda (x) (* x x)) '(1 2 3))
;Value 15: (1 4 9)

有人能帮我理解我做错了什么吗?

你应该理解这一点

(lambda () 42)

它们不是一回事。计算时的第一个元素返回一个可调用对象,调用时返回42,计算时的第二个元素返回一个列表,其中第一个元素是符号
lambda
,第二个元素是空列表,第三个元素是数字42

代码将
abc
定义为包含列表的列表,其中第一个元素是符号
lambda
,而不是包含可调用函数的列表。为此,你需要写作

(define abc (list (lambda (x) (* x x))))

换句话说,需要对
lambda
表单进行求值才能为您提供可调用的函数。

另一种表示法,虽然在本文中不太清楚,但如果使用正确的方法,有时更清楚,就是使用准注释(back tic`),它允许您引用大型数据结构,但仍然使用(unquote,)`(,(lambda(x)(*x)),(lambda(x)x),(lambda(x)5))将问题视为您正在处理的
”((lambda…)
就好像它与
相同一样(列表(lambda…)
,但它们完全不同。它的答案很好地解释了原因。如果你对
引号
的工作原理感到困惑,那么如果你在任何地方都使用
列表
,并且从不对列表使用
引号
,只对符号使用,那么你犯的错误就会少很多。
(define abc (list (lambda (x) (* x x))))