2009-11-29 32 views
3

我正在學習衛生,並且試圖在Scheme中做一個簡單的循環。我想支持3種結構的如示例如下請在計劃中重構我的宏

(for i = 1 : (< i 4) : (++ i) 
    (printf "Multiplication Table for ~s\n" i) 
    (for j = 1 to 5 
    (printf "~s * ~s = ~s\n" i j (* i j)))) 

我也想for循環與過濾器這樣的支持:

(for k = 1 : 10 : (list even? (λ(x) (> x 4))) : (++ k) 
    (print k)) 

我有這個,但我可以看到大量的重複。請幫我刪除冗餘。

(define-syntax for 
    (syntax-rules (= to :) 
    [(for x = initial : final : conditions : increment body ...) 
    (letrec ([loop (λ(x) 
         (when (<= x final) 
         (when (andmap (λ(condition) (condition x)) conditions) 
          body ...) 
         (loop increment)))]) 
     (loop initial))] 
    [(for x = initial : condition : increment body ...) 
    (letrec ([loop (λ(x) 
         (when condition 
         body ... 
         (loop increment)))]) 
     (loop initial))] 
    [(for x = initial to n body) 
    (for x = initial : (<= x n) : (+ x 1) body)])) 
+0

您希望中斷符號的分配和條件檢查和增量的前綴。爲什麼? – 2009-11-30 08:36:56

+0

對不起,我沒有得到你,你指的是哪種特殊情況? – unj2 2009-11-30 14:25:20

回答

7

我在這裏看不到很多重複。只有一個。它可以這樣刪除:

(define-syntax for 
    (syntax-rules (= to :) 
    [(for x = initial : final : conditions : increment body ...) 
    (for x = initial : (<= x final): increment 
      (when (andmap (λ(condition) (condition x)) conditions) 
      body ...))] 
    [(for x = initial : condition : increment body ...) 
    (letrec ([loop (λ(x) 
         (when condition 
         body ... 
         (loop increment)))]) 
     (loop initial))] 
    [(for x = initial to n body) 
    (for x = initial : (<= x n) : (+ x 1) body)])) 
+0

這很不錯。謝謝。 – unj2 2009-11-30 14:27:23