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 <gust...@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 >> <ro...@eecs.northwestern.edu> wrote: >>> These seem correct to me. What were you expecting (and why?). >>> >>> Robby >>> >>> >>> On Saturday, April 19, 2014, Gustavo Massaccesi <gust...@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 >>>> <matth...@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 <matth...@ccs.neu.edu> >>>>> wrote: >>>>> >>>>>> >>>>>> On Apr 15, 2014, at 9:29 PM, Asumu Takikawa <as...@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 _________________________ Racket Developers list: http://lists.racket-lang.org/dev