如何在 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
表单需要 评估 才能为您提供可调用的函数。
我在弄清楚如何使用包含在 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
表单需要 评估 才能为您提供可调用的函数。