Thanks anyway for taking the trouble to answer. Jos > -----Original Message----- > From: Deren Dohoda [mailto:deren.doh...@gmail.com] > Sent: 18 September 2010 21:35 > To: Jos Koot > Cc: PLT-Scheme Mailing List > Subject: Re: [racket] internal definitions in r6rs > > I see, please ignore my last response, as you were talking about > letrec* and not letrec. > > Deren > > On Sat, Sep 18, 2010 at 3:33 PM, Deren Dohoda > <deren.doh...@gmail.com> wrote: > > Hi Jos, > > > > (meant to reply to all... sorry) > > > > (letrec (<bindings>) exps ...) > > where <bindings> is > > (<var> <init>) ... > > > > From page 36 on letrec: > > "It must be possible to evaluate each <init> without assigning or > > referring to the value of the corresponding <variable> or the > > <variable> of any bindings that follow it in <bindings>." > > > > In short: > > you can use the *name* but you can't use the *value*. > > > >> This I interpret as allowing an internal definition to > refer to the > >> value of a previously defined variable. > > It does not. That would be the * forms, which is why your > last example works. > > > > Deren > > > > On Sat, Sep 18, 2010 at 6:52 AM, Jos Koot > <jos.k...@telefonica.net> wrote: > >> 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 > >> > >
_________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users