Yes, clearly a BC compiler bug --- and probably almost as old as
Racket. The bug was specific to `set!` on a locally bound variable as
the first subexpression of `begin0`.

I've pushed a repair.

Thanks!

At Wed, 17 Jun 2020 03:35:51 -0500, Alexis King wrote:
> This is quite curious. It appears to be a compiler bug. Here’s a very 
> slightly 
> smaller test case:
> 
>     #lang racket/base
>     (define count!
>       (let ([i 0])
>         (λ () (begin0
>                 (set! i (add1 i))
>                 (+ i)))))
>     (count!)
> 
> The fully-expanded program looks fine, so it isn’t the expander’s fault:
> 
>     (module counter racket/base
>       (#%module-begin
>        (module configure-runtime '#%kernel
>          (#%module-begin (#%require racket/runtime-config) (#%app configure 
> '#f)))
>        (define-values
>         (count!)
>         (let-values (((i) '0))
>           (lambda () (begin0 (set! i (#%app add1 i)) (#%app + i)))))
>        (#%app call-with-values (lambda () (#%app count!)) print-values)))
> 
> But `raco decompile` reveals that begin0 has been mysteriously replaced with 
> begin in the compiled program:
> 
>     (module counter ....
>       (require (lib "racket/base.rkt"))
>       (provide)
>       (define-values
>        (count!)
>        (let ((local54 '0))
>          (begin
>            (set! local54 (#%box local54))
>            (lambda ()
>              '#(count! #<path:/tmp/counter.rkt> 4 4 53 63 #f)
>              '(flags: preserves-marks single-result)
>              '(captures: (val/ref local54))
>              (begin
>                (#%set-boxes! (local54) (add1 (#%unbox local54)))
>                (+ (#%unbox local54)))))))
>       (#%apply-values print-values (count!))
>       (void)
>       (module (counter configure-runtime) ....
>         (require '#%kernel (lib "racket/runtime-config.rkt"))
>         (provide)
>         (print-as-expression '#t)
>         (void)))
> 
> It seems perhaps an optimization has gone awry. The bug appears to be quite 
> old: I can reproduce it as far back as 6.1.1. (I didn’t test any versions 
> earlier than that.) Unsurprisingly, the issue does not occur on Racket CS, 
> which is consistent with the hypothesis that this is a compiler bug.
> 
> Alexis
> 
> > On Jun 17, 2020, at 02:04, Sage Gerard <[email protected]> wrote:
> > 
> > I attached a video demonstrating what I'm seeing. In case it does not load 
> or is not available, I'll summarize here. Forgive any typos; it's been a late 
> night of coding.
> > 
> > Here's a module with an incorrect counter. It's incorrect because it uses 
> begin0, and is therefore expected to return void instead of an incrementing 
> integer.
> > 
> > #lang racket
> > (provide count!)
> > (define count!
> >   (let ([i 0])
> >     (λ () (begin0
> >             (set! i (add1 i))
> >             (~v i)))))
> > 
> > Notice that I added the ~v to format the return value. If I launch Racket 
> v7.7.0.5 using racket -it prog.rkt, (count!) returns the formatted value. But 
> if I remove the ~v, it behaves as written (returning void).
> > 
> > The video shows the behavior with and without ~v, both in DrRacket and 
> racket. DrRacket is the only environment that consistently runs the code 
> correctly.
> > 
> > ~slg
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/racket-users/781BE0E5-E6E5-4F0B-8B46-5227FDFB
> 8835%40gmail.com.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/20200617071306.bc%40sirmail.smtp.cs.utah.edu.

Reply via email to