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 <s...@sagegerard.com> 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 > v188.8.131.52 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 racket-users+unsubscr...@googlegroups.com. > 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 racket-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/20200617071306.bc%40sirmail.smtp.cs.utah.edu.