方案中的define-syntax问题

时间:2013-04-25 01:35:22

标签: for-loop lisp scheme

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

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

1 个答案:

答案 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