【问题标题】:Please refactor my macro in Scheme请在 Scheme 中重构我的宏
【发布时间】:2010-12-21 11:35:02
【问题描述】:

我正在学习卫生,我尝试在 Scheme 中创建一个简单的 for 循环。我想支持三种结构,如下例所示

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

【问题讨论】:

  • 您需要中缀表示法进行赋值,前缀表示条件检查和增量。为什么?
  • 很抱歉我没有听懂你,你指的是哪些特殊情况?

标签: functional-programming macros scheme for-loop syntax-rules


【解决方案1】:

我在这里没有看到很多重复。只有一个。可以这样删除:

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

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2014-11-18
    相关资源
    最近更新 更多