On Fri 15 Jul 2016 16:26, Pierre Lairez <[email protected]> writes:

> (do ((i 1 (+ 1 i))
>      (j 0 i))
>     ((> i 4) (newline))
>   (display (list i j)))
>
> I expect without hesitation to read
> (1 0)(2 1)(3 2)(4 3)
>
> To my surprise, I obtain
> (1 0)(2 2)(3 3)(4 4)

What a mess!

This is an optimizer bug in Guile 2.0 somehow.  This code is small
enough for it to be partially evaluated.  These forms expand to the same
thing, but in Guile 2.0:

  > ,optimize (do ((i 1 (+ 1 i))
                   (j 0 i))
                  ((> i 4) (newline))
                (display (list i j)))
  (begin
    (display (list 1 0))
    (begin
      (display (list 2 2))
      (begin
        (display (list 3 3))
        (begin (display (list 4 4)) (newline)))))


whereas in Guile master (2.1.3 or whatever):

  > ,optimize (do ((i 1 (+ 1 i))
                   (j 0 i))
                  ((> i 4) (newline))
                (display (list i j)))
  (begin
    (display (list 1 0))
    (display (list 2 1))
    (display (list 3 2))
    (display (list 4 3))
    (newline))

How embarrassing.  I will work on a fix.

Andy

Reply via email to