And yet again I am an idiot, as you did not refer to the value of a binding that *follows* it. Instead you are referring to a value that precedes it, which should be allowed. Thankfully that does restore my mental model of the starred lets, though, so apart from several embarrassing emails on this list I am back where I started. As, unfortunately, are you.
Deren On Sat, Sep 18, 2010 at 6:50 PM, Deren Dohoda <deren.doh...@gmail.com> wrote: > Actually, after reading more, letrec* also demands (again page 36, top > of second column): > > "It must be possible to evaluate each <init> without assigning or > referring to the value of the corresponding <variable> or the > <variable> of any of the bindings that follow it in <bindings>." > > letrec* is not like let* at all, really, which kind of crushes my > mental model a bit. > > It seems, then, that your example at the end using letrec* should not > work, as you have evaluated an <init> while referring to the value of > <variable>. > > Deren > > On Sat, Sep 18, 2010 at 3:37 PM, Jos Koot <jos.k...@telefonica.net> wrote: >> 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