В Kawa Interpeter это работает В Guile это не так, потому что этот код
(define (f x) (define a x) (define b a) b)
расширен до
(define (f x) (letrec ((a x) (b a)) b))
И вы не можете получить доступ к a
раньшеЯ назначаю.letrec
не будет работать для не функциональных определений, например:
(letrec ((x 5)
(y x))
y)
Вы можете использовать let*
insted
(define (f x) (let* ((a x) (b a)) b))
В этом коде
(define (f x) (define a x) (define (b) a) (b))
В процедуре b вы получаете доступ к переменной, когда она уже определена.