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

How to use lambdas from a list in 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 尝试同样的事情时,它起作用了:

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

谁能帮我理解我做错了什么?

你应该明白

(lambda () 42)

'(lambda () 42)

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

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

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

换句话说,lambda 表单需要 评估 才能为您提供可调用的函数。