[racket] internal definitions in r6rs

From: Deren Dohoda (deren.dohoda at gmail.com)
Date: Sat Sep 18 18:50:26 EDT 2010

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.