В SICP 1.2.1 существует функция, которая делает рациональное число, следующим образом:
(define (make-rat n d)
(let ((g (gcd n d)))
(cons (/ n g) (/ d g))))
Мне просто любопытно, как можно реализовать то же самое с помощью лямбды вместо позволенного, не называя GCD дважды. Я не мог изобразить его сам.
Глядя на раздел 1.3.2 SICP ,
(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)