【问题标题】:How to use lambdas from a list in Scheme如何在 Scheme 中使用列表中的 lambda
【发布时间】:2016-04-23 08:03:19
【问题描述】:

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

(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 ...)) 视为与(list (lambda ...)) 相同的问题,但它们完全不同。 This question 及其答案很好地解释了原因。
  • 如果您对quote 的工作原理感到困惑,那么如果您在任何地方都使用list,并且永远不要将quote 用于列表,只用于符号,那么您将少犯很多错误.

标签: lambda scheme lisp higher-order-functions mit-scheme


【解决方案1】:

你应该明白

(lambda () 42)

'(lambda () 42)

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

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

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

换句话说,lambda 表单需要被评估以提供可调用的函数。

【讨论】:

  • 另一种表示法,虽然在这种情况下不太清楚,但如果使用正确,有时会更清楚,是使用准引号(back-tic `),它可以让你引用一个大的数据结构,但仍然评估部分带有 (unquote ,)
  • `(,(lambda (x) (* x x)) ,(lambda (x) x) ,(lambda (x) 5))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2019-04-13
  • 2019-10-23
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多