在方案中使用lambda而不是let

Cam*_*mel 7 lambda scheme sicp

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

(define (make-rat n d)
  (let ((g (gcd n d)))
    (cons (/ n g) (/ d g))))
Run Code Online (Sandbox Code Playgroud)

我只是好奇你如何使用lambda而不是let来实现相同的东西,而不需要两次调用GCD.我自己无法理解.

Bil*_*ard 13

看看SICP第1.3.2节,

(let ((<var1> <exp1>)
      (<var2> <exp2>)
      ...
      (<varn> <expn>))
   <body>)
Run Code Online (Sandbox Code Playgroud)

相当于

((lambda (<var1> ...<varn>)
    <body>)
 <exp1>
 ...
 <expn>)
Run Code Online (Sandbox Code Playgroud)

所以你的程序,

(define (make-rat n d)
  (let ((g (gcd n d)))
    (cons (/ n g) (/ d g))))
Run Code Online (Sandbox Code Playgroud)

应该相当于

(define (make-rat n d)
  ((lambda (g)
    (cons (/ n g) (/ d g)))
  (gcd n d)))
Run Code Online (Sandbox Code Playgroud)


Ama*_*dan 10

这两件事情是一样的:

((lambda (p1 p2...) body) v1 v2...)
Run Code Online (Sandbox Code Playgroud)

(let ((p1 v1) (p2 v2)...) body)
Run Code Online (Sandbox Code Playgroud)