As an exercise to learn call/cc and macros, I tried to define goto.
(define-syntax label
(syntax-rules ()
((_ name)
(begin
(define name)
(call/cc (lambda (c) (set! name c)))))))
(define (goto label) (label))
(define i 0)
(label start)
(display i) (newline)
(set! i (+ i 1))
(if (< i 3) (goto start))
(display "done") (newline)
It works in guile-2.0, but in chez scheme and racket (r6rs) it just prints
0
done
Which implementation is correct?