[racket] internal definitions in r6rs

From: Deren Dohoda (deren.dohoda at gmail.com)
Date: Sat Sep 18 19:01:59 EDT 2010

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.dohoda at 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.koot at telefonica.net> wrote:
>> Thanks anyway for taking the trouble to answer.
>> Jos
>>
>>> -----Original Message-----
>>> From: Deren Dohoda [mailto:deren.dohoda at 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.dohoda at 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.koot at 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
>>> >>
>>> >
>>
>>
>>
>


Posted on the users mailing list.