Hi, Section 11.3 of R6RS states: "An expanded <body> (see chapter 10) containing variable definitions can always be converted into an equivalent letrec* expression." The semantics of letrec* includes "each <variable> is assigned in left-to-right order". This I interpret as allowing an internal definition to refer to the value of a previously defined variable. However: #!r6rs (import (rnrs base (6)) (rnrs io simple (6))) (define (a) (define (b) "who cares?") (define c (b)) c) (write (a)) Produces: Welcome to DrRacket, version 5.0.1.5--2010-09-13(5b54caebb066920e2585244a5ee444a3f121c966/a) [3m]. Language: r6rs; memory limit: 2000 MB. . . procedure application: expected procedure, given: #<undefined> (no arguments) The code expands as follows. The hot spots is marked with an arrow. (module anonymous-module r6rs (#%plain-module-begin (#%require r6rs/private/prelims) (#%require (lib "rnrs/base-6.rkt")) (#%require (for-meta #f (lib "rnrs/base-6.rkt"))) (#%require (lib "rnrs/io/simple-6.rkt")) (#%require (for-meta #f (lib "rnrs/io/simple-6.rkt"))) (define-values (a) (#%plain-lambda () (let-values (((b) undefined) ((c) undefined)) (let-values ; <====== prohibits reference to value of previously defined var (((newtemp) (#%plain-lambda () (letrec-values () (let-values () '"who cares?")))) ((newtemp:19) (#%app b))) ; <====== (set! b newtemp) (set! c newtemp:19) (let-values:20 () (let-values:21 () c)))))) (#%app write (#%app a))))
Is this a bug or do I misunderstand R6RS? The following works correct: #!r6rs (import (rnrs base (6)) (rnrs io simple (6))) (define (a) (letrec* ((b (lambda () "who cares?")) (c (b))) c)) (write (a)) Thanks, Jos
_________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users