2013-04-25 38 views
1

我在想如何在方案中定義我的for-loop問題。 每當我嘗試運行for語句時,它會運行相當長的一段時間,然後崩潰。方案中的define-syntax問題

(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)))])) 

它應該運行初始條件,檢查測試,運行正文,然後循環到下一次運行。

回答

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