3

私は衛生学を学んでいて、Schemeで単純なforループを作成しようとしました。以下の例に示すように、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 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)]))
4

1 に答える 1

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)]))
于 2009-11-30T10:29:44.303 に答える