2010/05/24

syntax-rules: for

結局、9LISP の宿題をやり終えていなかったので、いくつか書いていました。

for をより for らしく書き直していったつもりでしたが、do マクロに近づいて行きました。do マクロと聞くと do ~ while とか do ~ until などを連想しますが、for に近いですね。というか、for じゃないですか。
これは、for というより nfor といった感じでしょうか。
(define-syntax for
(syntax-rules ()
((_ (var from to) body ...)
(let loop ((var from))
(when (< var to)
body ...
(loop (+ var 1)))))))
view raw for-01.scm hosted with ❤ by GitHub


step を追加。
(define-syntax for
(syntax-rules ()
((_ (var from to step) body ...)
(let loop ((var from))
(when (< var to)
body ...
(loop (+ var step)))))
((_ (var from to) body ...)
(for (var from to 1) body ...))))
view raw for-03.scm hosted with ❤ by GitHub


練習がてら do マクロで書き直し。
(define-syntax for
(syntax-rules ()
((_ (var from to step) body ...)
(do ((var from (+ var step)))
((not (< var to)))
body ...))))
view raw for-04.scm hosted with ❤ by GitHub


数値に限らないように書き直し。
(define-syntax for
(syntax-rules ()
((_ (var init pred update) body ...)
(let loop ((var init))
(when pred
body ...
(loop update))))
((_ (var pred update) body ...)
(for (var #f pred update) body ...))))
view raw for-05.scm hosted with ❤ by GitHub


再度 do マクロ。
(define-syntax for
(syntax-rules ()
((_ (var init pred update) body ...)
(do ((var init))
((not pred))
body ...
update))
((_ (var pred update) body ...)
(for (var #f pred update) body ...))))
view raw for-06.scm hosted with ❤ by GitHub


さらに、for らしく。
(define-syntax for
(syntax-rules ()
((_ (((var init) ...)
(pred ...)(update ...)) body ...)
(do ((var init) ...)
((not (and pred ...)))
body ...
update ...))))
view raw for-07.scm hosted with ❤ by GitHub


この辺で、劣化 do マクロを書いている様な気がしてきたので終了。

for って自由度高いですよね
for (var today = new Date(),
y = today.getFullYear(),
m = today.getMonth(),
bom = new Date(y, m, 1),
eom = new Date(y, m + 1, 0),
day = 1;
day <= eom.getDate();
day++){
alert (day);
};
for (var i = 0; i < 10; i % 2 == 0 ? i % 4 == 0 ? i = i + 2 : i = i + 1 : i = i + 1) {
alert (i);
}
var i = 0;
for (;;){
if (10 < i){
break;
}
alert (i++);
}
for (var b1 = false, b2 = false, i = 0; b1 !== b2, i !== 50;){
if (i == 10){
b1 = true;
}
if (i == 20){
b2 = true;
}
alert(i++);
}
view raw for.js hosted with ❤ by GitHub


プログラミングGauche

0 件のコメント:

コメントを投稿