[racket-dev] Catching the undefined value

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Sat Apr 19 16:45:11 EDT 2014

Morally TR ought to report the type of this x as empty set, 
which would inform you that the else branch is unreachable: 

  (letrec ([x : Integer (if #t 0 x)]) x)

One day we may wish to augment syntax check in TR so that 
programmers can read of the reconstructed types for interior 
expressions. 

-- Matthias







On Apr 19, 2014, at 3:26 PM, Robby Findler wrote:

> Ah. There are other approaches to this problem that result in
> compile-time errors for such programs. Maybe the TR guys will adopt
> one or figure out a better one! But for regular ole Racket, we're
> stuck with a runtime error, I'm afraid.
> 
> Robby
> 
> On Sat, Apr 19, 2014 at 2:04 PM, Gustavo Massaccesi <gustavo at oma.org.ar> wrote:
>>>> (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.