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

cas*_*cal 4 lisp lambda scheme higher-order-functions mit-scheme

我在查找如何使用Scheme中列表中包含的lambda时遇到了一些麻烦.例如,我有以下代码:

(define abc '((lambda (x) (* x x))))
Run Code Online (Sandbox Code Playgroud)

我想从列表中取出第一个lambda并将其应用于某些数字.这是我到目前为止:

(map (car abc) '(1 2 3))
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

;The object (lambda (x) (* x x)) is not applicable.
Run Code Online (Sandbox Code Playgroud)

但是,当我直接使用lambda尝试同样的事情时,它的工作原理是:

(map (lambda (x) (* x x)) '(1 2 3))
;Value 15: (1 4 9)
Run Code Online (Sandbox Code Playgroud)

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

650*_*502 6

你应该明白这一点

(lambda () 42)
Run Code Online (Sandbox Code Playgroud)

'(lambda () 42)
Run Code Online (Sandbox Code Playgroud)

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

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

(define abc (list (lambda (x) (* x x))))
Run Code Online (Sandbox Code Playgroud)

换句话说,lambda需要对表单进行求值以提供可调用的函数.