[racket-dev] Catching the undefined value

From: Gustavo Massaccesi (gustavo at oma.org.ar)
Date: Sat Apr 19 11:38:10 EDT 2014

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

Posted on the dev mailing list.