LISP Scheme Part7
■ このスレッドは過去ログ倉庫に格納されています
0336313
NGNGマクロも普通の関数と同様に定義できます。
(基本的に評価規則は変化しない)
ただし、今のところ目的コードはS式なので、
LISPのマクロを書く感覚とまるっきり同じです。
//同一タグのリスト木をまとめる関数
define flat-tag (tag, totag, s) =>
let loop (x=s, r='()) in
if pair?(x)then
if tagged-list?(car(x), tag) then
loop(append(cdar(x), cdr(x)), r)
else loop(cdr(x), cons(car(x) , r))
else `(,totag ,@(reverse r));
//ネストするstring-appendをまとめるマクロ
define-macro +s x => flat-tag('+s, 'string-append, x);
このままでも関数形式で使えますが、
+s("a", +s("b", +s("c", "d")));
-> (string-append "a" "b" "c" "d")
=> "abcd"
これを2項演算子として登録すれば、
"a" +s "b" +s "c" +s "d";
-> (string-append "a" "b" "c" "d")
=> "abcd"
となります。(+を総称化してれば不用ですが)
■ このスレッドは過去ログ倉庫に格納されています