[racket-dev] Catching the undefined value

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Sat Apr 19 12:02:29 EDT 2014

These seem correct to me. What were you expecting (and why?).

Robby

On Saturday, April 19, 2014, Gustavo Massaccesi <gustavo at oma.org.ar> wrote:

> I found another problem with the optimizer and the new undefined behavior.
>
> (letrec ([x (if #t 8 x)]) x) ;==>8
>
> I also consider this correct in a strange sense :).
>
> Gustavo
>
>
> Welcome to Racket v6.0.1.4.
> > (letrec ([x x]) x)
> x: undefined;
>  cannot use before initialization
>   context...:
>    C:\Program Files\Racket-6.0.1.4\collects\racket\private\misc.rkt:87:7
> > (letrec ([x 5]) x)
> 5
> > (letrec ([x (if #t 8 x)]) x)
> 8
> > (letrec ([x (if #f 8 x)]) x)
> x: undefined;
>  cannot use before initialization
>   context...:
>    C:\Program Files\Racket-6.0.1.4\collects\racket\private\misc.rkt:87:7
> >
>
>
> On Wed, Apr 16, 2014 at 10:09 AM, Matthias Felleisen
> <matthias at ccs.neu.edu <javascript:;>> wrote:
> >
> > Ah, too bad:
> >
> >> pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl
> >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >> --- OLD/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl
> >> +++ NEW/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl
> >> @@ -3416,5 +3416,16 @@
> >>           (read (open-input-bytes (get-output-bytes o))))))
> >>
> >> ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> >> +;; Check that an unsufe opertion's argument is
> >> +;; not "optimized" away if it's a use of
> >> +;; a variable before definition:
> >> +
> >> +(err/rt-test (let ()
> >> +               (unsafe-fx+ x 1)
> >> +               (define x 3)
> >> +               x)
> >> +             exn:fail:contract:variable?)
> >> +
> >> +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> >
> >
> > :-)
> >
> > On Apr 16, 2014, at 9:02 AM, Matthias Felleisen <matthias at ccs.neu.edu<javascript:;>>
> wrote:
> >
> >>
> >> On Apr 15, 2014, at 9:29 PM, Asumu Takikawa <asumu at ccs.neu.edu<javascript:;>>
> wrote:
> >>
> >>> On 2014-04-15 18:13:31 -0400, claire alvis wrote:
> >>>> The push below includes changes to letrec expressions, internal
> >>>> definitions, units, classes, and certain ill-formed shared
> expressions so
> >>>> that they no longer leak the `undefined' value.
> >>>
> >>> This is great! (especially happy that TR, even with classes, doesn't
> >>> have to worry about #<undefined> anymore)
> >>>
> >>> BTW, I found this weird behavior:
> >>>
> >>> Welcome to Racket v6.0.1.3.
> >>> -> (require racket/unsafe/ops)
> >>> -> (let () (+ x 3) (define x 3) 5)
> >>> ; x: variable used before its definition [,bt for context]
> >>> -> (let () (unsafe-fx+ x 3) (define x 3) 5)
> >>> 5
> >>
> >>
> >> I consider this correct in a strange sense.
> >>
> >> Interestingly enough,
> >>
> >>> (let () (displayln  (unsafe-fx+ x 3)) (define x 3) 5)
> >> x: variable used before its definition
> >>  context...:
> >>   /Users/matthias/plt/racket/collects/racket/private/misc.rkt:87:7
> >>
> >> which is good too. I don't know how Claire and Matthew did this,
> >> but it's good :-)
> >> _________________________
> >>  Racket Developers list:
> >>  http://lists.racket-lang.org/dev
> >
> > _________________________
> >   Racket Developers list:
> >   http://lists.racket-lang.org/dev
> _________________________
>   Racket Developers list:
>   http://lists.racket-lang.org/dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/dev/archive/attachments/20140419/a9b9e67f/attachment.html>

Posted on the dev mailing list.