作为学习 call/cc 和宏的练习,我尝试定义 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)
它在 guile-2.0 中工作,但在 chez 方案和球拍(r6rs)中它只是打印
0
done
哪个实现是正确的?