unj*_*nj2 3 macros scheme for-loop functional-programming syntax-rules
我正在学习卫生,我试图在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))))
Run Code Online (Sandbox Code Playgroud)
我想也支持带有这样的过滤器的循环:
(for k = 1 : 10 : (list even? (?(x) (> x 4))) : (++ k)
(print k))
Run Code Online (Sandbox Code Playgroud)
我有这个,但我可以看到很多重复.请帮我删除冗余.
(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)]))
Run Code Online (Sandbox Code Playgroud)
我在这里看不到很多重复.只有一个.它可以这样删除:
(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)]))
Run Code Online (Sandbox Code Playgroud)