1

我想知道我如何在方案中定义我的 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)))]))

它应该运行初始条件,检查测试,运行主体,然后循环到下一次运行。

4

1 回答 1

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
于 2013-04-25T02:09:52.227 回答