我在查找如何使用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)
有人可以帮我理解我做错了吗?
答案 0 :(得分:6)
你应该明白
(lambda () 42)
和
'(lambda () 42)
不是一回事。第一个被评估时会返回一个可调用对象,当被调用时返回42,第二个返回时返回一个列表,其中第一个元素是符号lambda
,第二个元素是空列表,第三个元素是42号。
您的代码将abc
定义为包含列表的列表,其中第一个元素是符号lambda
,而不是包含可调用函数的列表。为此你需要写
(define abc (list (lambda (x) (* x x))))
换句话说,lambda
形式需要评估才能为您提供可调用的功能。