我想知道我如何在方案中定义for循环出了什么问题。 每当我尝试用它运行for语句时,它会运行很长一段时间然后崩溃。
(define-syntax for
(syntax-rules (:)
[(_ (initial : test : update) body)
(begin initial
(if test
(begin body update
(for [test : update] body))))]
[(_ (test : update) body)
(if test
(begin body update
(for [test : update] body)))]))
它应该运行初始条件,检查测试,运行主体,然后循环到下一次运行。
答案 0 :(得分:3)
您的宏失败,因为宏是递归的,并且没有基本情况。因此,在编译期间,宏会再次展开,再次展开,并再次展开。
这是一个实现:
(define-syntax for
(syntax-rules (:)
((_ (initial : test : update) body)
(begin initial
(let repeating ()
(when test
body
update
(repeating)))))
((_ (test : update) body)
(for (#f : test : update) body))))
> (let ((foo 0))
(for ((set! foo 5) : (positive? foo) : (set! foo (- foo 1))) ;; w/ init
(begin (display 'YES) (newline))))
YES
YES
YES
YES
YES
> (let ((foo 2))
(for ((positive? foo) : (set! foo (- foo 1))) ;; w/o init
(begin (display 'YES) (newline)))
YES
YES