【问题标题】:Make procedure in Scheme by lambda通过 lambda 在 Scheme 中创建过程
【发布时间】:2019-11-14 15:21:05
【问题描述】:

我正在通过'计算机程序的结构和解释'学习Scheme

在第 1.3.2 章 使用 lambda 构造过程

我是这样理解 lambda 的。

与 lambda 匹配的值写在 lambda 括号外。

<b>(</b>(lambda (x) (+ x 4) <b>4)</b> ; (x) is matched to 4, result is 8

但是在SICP中,另一个示例代码是不同的。

代码是:

(define (sum x y) (+ x y))

(define (pi-sum a b)
  (sum (lambda (x) (/ 1.0 (* x (+ x 3))))
        a
        (lambda (x) (+ x 4))
        b
         ))

(pi-sum 3 6)

我认为如果(lambda (x) (/ 1.0 (* x (+ x 3)))) 想要匹配alambdaa 必须用括号括起来。

但在示例代码中,不要使用括号。

当我运行这段代码时,会发生错误。

错误是这样的:

***'sum: expects only 2 arguments, but found 4'***

当我使用更多这样的括号时:

(define (sum x y) (+ x y))

(define (pi-sum a b)
  (sum ((lambda (x) (/ 1.0 (* x (+ x 3))))
        a)
        ((lambda (x) (+ x 4))
        b)
         ))

(pi-sum 2 6) ; result is 10.1

代码已运行。

SICP 的示例代码让我很困惑。

我在lambda的原则上是对的吗?

如果我是对的,为什么 SICP 那样写?

【问题讨论】:

    标签: scheme sicp


    【解决方案1】:

    它说使用 1.3.1 的总和。在第 77 页(实际上从 77 开始到 78 结束)看起来像这样:

    (define (sum term a next b)
      (if (> a b)
          0
          (+ (term a)
             (sum term (next a) next b))))
    

    如您所见,它看起来与您的 sum 有很大不同,后者只是将两个数字相加。您在pi-sum 中也有错字:

    (define (pi-sum a b)
      (sum (lambda (x) (/ 1.0 (* x (+ x 2)))) ; multiplied by 2, not 3!
           a
           (lambda (x) (+ x 4))
           b))
    
    (* 8 (pi-sum 1 1000))
    ; ==> 3.139592655589783
    

    所以这里的重点是您可以传递 lambdas 而不是命名过程。由于(define (name . args) body ...) 只是(define name (lambda args body ...)) 的语法糖,传递(lambda args body ...) 而不是定义它并传递名称只是一个相等的重构。

    变量(+) 或lambda ((lambda args body ...)) 周围的括号调用运算符表达式计算的任何过程。这不是您想要的,因为您传递了sum 使用的过程作为抽象。 sum 可以根据您传递的内容进行乘法或任意数量的事情。在sum term 中是(lambda (x) (/ 1.0 (* x (+ x 2)))) 过程,您会看到它将其作为代码的一部分来调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多