在SICP 1.2.1中,有一个函数可以使合理数字构成:如下:

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

我只是好奇您如何使用lambda而不是让labda实现同一件事,而无需两次致电GCD。我自己无法弄清楚。

有帮助吗?

解决方案

看着 SICP第1.3.2节,

(let ((<var1> <exp1>)
      (<var2> <exp2>)
      ...
      (<varn> <expn>))
   <body>)

等同于

((lambda (<var1> ...<varn>)
    <body>)
 <exp1>
 ...
 <expn>)

所以你的程序,

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

应该等同于

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

其他提示

这两件事是相同的:

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

(let ((p1 v1) (p2 v2)...) body)
(define-syntax let-as-lambda
  (syntax-rules ()
        ((_ (x value) body)
            (let ((x value))
              body))))

(printf "~s~n" (let-as-lambda (x 1) (+ x 1)))

让我们检查两个简单的案例,以便我们可以理解如何重写使用Lambda的任何功能:

  1. 在我们的第一种情况下,我们有一个。此功能非常简单,它通过向其添加10个返回给定输入:

    (define (test x)
      (let ((b 10))
        (+ x b)))
    

现在,让我们使用lambda将其转变为表达式:

    (define (test-lambda x)
      ((lambda (b)
         (+ x b))
       10))

如您所见,Test-Lambda返回使用值10进行评估的lambda评估。对此我们可以说:

    (test-lambda 10)

将返回20。

  1. 现在,对于多个LET,我们将lambda表达在lambda-exptressions中嵌套。

我们的案例我们有两个让陈述:

    (define (lets x)
      (let ((a 10)
            (b 20))
        (+ x a b)))

我们可以像这样写这句话:

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

因此,现在我们正在评估每种lambda表达式,从而使它们具有值,而最内向的lambda表达式会使用每个lambda表达式所分配的变量名称来计算我们要计算的内容。

希望这很清楚,可以帮助其他人更清楚地看到!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top