Bitte Refactoring meine Makro in Schema
-
08-07-2019 - |
Frage
Ich lerne, Hygiene und ich versuchte, eine einfache for-Schleife in Schema zu machen. Ich möchte drei Arten von Konstrukten in Beispiel unter
wie abgebildet unterstützen(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))))
Ich mag auch für Schleifen mit Filtern wie folgt unterstützen:
(for k = 1 : 10 : (list even? (λ(x) (> x 4))) : (++ k)
(print k))
Ich habe dies aber ich kann eine Menge Wiederholung sehen. Bitte helfen Sie mir Redundanzen entfernen.
(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)]))
Lösung
Ich habe eine Menge Wiederholung nicht hier. Nur einer. Es kann auf diese Weise entfernt werden:
(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)]))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow