[racket] internal definitions in r6rs
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20100918/22af50ed/attachment.html>