[racket-dev] Catching the undefined value

From: Gustavo Massaccesi (gustavo at oma.org.ar)
Date: Sat Apr 19 15:04:06 EDT 2014

>> (letrec ([x (if #t 8 x)]) x) ;==>8

It was a mistake. I thought that the “x: undefined; ...” error was an
expansion-time error, not a run-time error.

(I expected an error, because the x in the else part is “undefined”,
even if it’s never accessed.)

Gustavo


On Sat, Apr 19, 2014 at 1:02 PM, Robby Findler
<robby at eecs.northwestern.edu> wrote:
> 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> 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>
>> > wrote:
>> >
>> >>
>> >> On Apr 15, 2014, at 9:29 PM, Asumu Takikawa <asumu at ccs.neu.edu> 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


Posted on the dev mailing list.