使用lambda代替let-in方案

使用lambda代替let-in方案,lambda,scheme,sicp,Lambda,Scheme,Sicp,在SICP 1.2.1中,有一个生成有理数的函数,如下所示: (define (make-rat n d) (let ((g (gcd n d))) (cons (/ n g) (/ d g)))) 我只是想知道,如何使用lambda而不是let实现同样的事情,而不必调用GCD两次。我自己想不出来。这两件事是一样的: ((lambda (p1 p2...) body) v1 v2...) 及 看, 应该相当于 (define (make-rat n d) ((lambda (

在SICP 1.2.1中,有一个生成有理数的函数,如下所示:

(define (make-rat n d)
  (let ((g (gcd n d)))
    (cons (/ n g) (/ d g))))

我只是想知道,如何使用lambda而不是let实现同样的事情,而不必调用GCD两次。我自己想不出来。

这两件事是一样的:

((lambda (p1 p2...) body) v1 v2...)

看,

应该相当于

(define (make-rat n d)
  ((lambda (g)
    (cons (/ n g) (/ d g)))
  (gcd n d)))

让我们检查两个简单的案例,以便了解如何重写使用Let和lambda的任何函数:

  • 在我们的第一种情况下,我们有一个让。此函数非常简单,它通过向其中添加10来返回给定的输入:

    (define (test x)
      (let ((b 10))
        (+ x b)))
    
  • 现在,让我们使用lambda将其转换为表达式:

        (define (test-lambda x)
          ((lambda (b)
             (+ x b))
           10))
    
    如您所见,testlambda返回一个lambda计算值,该值用值10进行计算。对此,我们可以说:

        (test-lambda 10)
    
    它将返回20

  • 现在,对于多个let,我们在lambda表达式中嵌套lambda表达式
  • 我们的let case有两个let语句:

        (define (lets x)
          (let ((a 10)
                (b 20))
            (+ x a b)))
    
    我们可以用lambda这样写:

        (define (lets-lambda x)
          ((lambda (a)
             ((lambda (b)
                (+ x a b))
              20))
           10))
    
    现在我们计算每个lambda表达式,给它们一个值,最里面的lambda表达式负责使用每个lambda表达式分配的变量名计算什么

    希望这是清楚的,可以帮助其他人看得更清楚

    (define (test x)
      (let ((b 10))
        (+ x b)))
    
        (define (test-lambda x)
          ((lambda (b)
             (+ x b))
           10))
    
        (test-lambda 10)
    
        (define (lets x)
          (let ((a 10)
                (b 20))
            (+ x a b)))
    
        (define (lets-lambda x)
          ((lambda (a)
             ((lambda (b)
                (+ x a b))
              20))
           10))