: letrec let . letrec let, set! . , :
(let
([sum (void)])
(set! sum (lambda (x) (if (zero? x) 0 (+ x (sum (- x 1))))))
(sum 5))
, ( , let let* - , ):
(let
([sum (void)]
(set! sum (lambda (x) (if (zero? x) 0 (+ x (sum (- x 1))))))
(let
[f (void)]
(set! f (lambda () (cons n n-sum)))
(let
[n (void)]
(set! n 15)
(let
[n-sum (void)])
(set! n-sum (sum n))
(f))
600%, let, , letrec ( ). , let let letrec let. , .
, letrec, . , let , define set! ( ).
, , , , , , , , ( letrec, let , YMMV). , , ( ).
, , :
(letrec
([even? (lambda (n) (if (zero? n)
[odd? (lambda (n) (if (zero? n)
(even? 88))
define :
(let ()
(define even? (lambda (n) (if (zero? n)
(define odd? (lambda (n) (if (zero? n)
(even? 88))
So the code letrecis actually shorter. And honestly, if you are doing something like the latter, why not settle for begin?
(begin
(define even? (lambda (n) (if (zero? n)
(define odd? (lambda (n) (if (zero? n)
(even? 88))
I suspect that it is beginmore built-in and, as such, will not receive macro expansion (for example, it letwill). Finally, a similar problem was raised in overflowing the Lisp stack a bit backward with more or less the same point.