実装の続き

今日は、defmacroの実装できました。
cexの実行部分も修正したりしたのですが。

emacro:ってのがマクロ展開後の配列みたいな感じの表現で
ecex:がマクロ展開後のcex表現です。

src :defmacro[a](b,c){(b+c)}stdout.write(a(1,2)+"\n");
cex :defmacro[a] (b , c) {(b + c)} stdout.write(a(1 , 2) + "\n") ;
list:[disable,[[id,defmacro,ID,1],[array,[id,a,ID,1]],[paren,[id,b,ID,1],[id,,,ID,1],[id,c,ID,1]],[block,[paren,[[id,+,ID,1],[id,b,ID,1],[id,c,ID,1]]]]],[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[[id,+,ID,1],[[id,a,ID,1],[paren,[id,1,NUMBER,1],[id,,,ID,1],[id,2,NUMBER,1]]],[id,"\n",STRING,1]]]]],[id,;,ID,1]]
emacro:[disable,[id,;,ID],[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[[id,+,ID,1],[paren,[[id,+,ID,1],[id,1,NUMBER,1],[id,2,NUMBER,1]]],[id,"\n",STRING,1]]]]],[id,;,ID,1]]
ecex:; stdout.write((1 + 2) + "\n") ;
3
exec:0

--------------------------------------------------------------------------------
src :defmacro[a](b,c){(b+c);1}stdout.write(a(1,2)+"\n");
cex :defmacro[a] (b , c) {(b + c) ; 1} stdout.write(a(1 , 2) + "\n") ;
list:[disable,[[id,defmacro,ID,1],[array,[id,a,ID,1]],[paren,[id,b,ID,1],[id,,,ID,1],[id,c,ID,1]],[block,[paren,[[id,+,ID,1],[id,b,ID,1],[id,c,ID,1]]],[id,;,ID,1],[id,1,NUMBER,1]]],[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[[id,+,ID,1],[[id,a,ID,1],[paren,[id,1,NUMBER,1],[id,,,ID,1],[id,2,NUMBER,1]]],[id,"\n",STRING,1]]]]],[id,;,ID,1]]
emacro:[disable,[id,;,ID],[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[[id,+,ID,1],[paren,[[id,+,ID,1],[id,1,NUMBER,1],[id,2,NUMBER,1]]],[id,;,ID,1],[id,1,NUMBER,1],[id,"\n",STRING,1]]]]],[id,;,ID,1]]
ecex:; stdout.write((1 + 2) + ;) ;
3;exec:0

--------------------------------------------------------------------------------
src :defmacro[a](b,c){(b+c)}defmacro[bb](b,c){(a(b,c)+1)}stdout.write(bb(1,2)+"\n");
cex :defmacro[a] (b , c) {(b + c)} defmacro[bb] (b , c) {(a(b , c) + 1)} stdout.write(bb(1 , 2) + "\n") ;
list:[disable,[[id,defmacro,ID,1],[array,[id,a,ID,1]],[paren,[id,b,ID,1],[id,,,ID,1],[id,c,ID,1]],[block,[paren,[[id,+,ID,1],[id,b,ID,1],[id,c,ID,1]]]]],[[id,defmacro,ID,1],[array,[id,bb,ID,1]],[paren,[id,b,ID,1],[id,,,ID,1],[id,c,ID,1]],[block,[paren,[[id,+,ID,1],[[id,a,ID,1],[paren,[id,b,ID,1],[id,,,ID,1],[id,c,ID,1]]],[id,1,NUMBER,1]]]]],[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[[id,+,ID,1],[[id,bb,ID,1],[paren,[id,1,NUMBER,1],[id,,,ID,1],[id,2,NUMBER,1]]],[id,"\n",STRING,1]]]]],[id,;,ID,1]]
emacro:[disable,[id,;,ID],[id,;,ID],[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[[id,+,ID,1],[paren,[[id,+,ID,1],[paren,[[id,+,ID,1],[id,1,NUMBER,1],[id,2,NUMBER,1]]],[id,1,NUMBER,1]]],[id,"\n",STRING,1]]]]],[id,;,ID,1]]
ecex:; ; stdout.write(((1 + 2) + 1) + "\n") ;
4
exec:0

--------------------------------------------------------------------------------

なんか、手抜きなので、マクロのあったところに、;が残ったり、
ツリーのリストの中に@@expandlistとかいうのがマクロ展開中に出来てたりする点が
問題と言えば問題なのですが。


演算子のパラメータは2つと限定した実装なので、2つ以上あると消えてしまうのも問題です。
リストのサイズのチェックもしてないので何事もなかったかのように動いてしまってます。
ま、いいや。


次は、syntaxmacroです。schemeのdefine-syntaxを入れたいと思います。


名前の衝突の解決と、パターンマッチングをどうするか?
ってところが問題です。名前の付け替えは前にepp使ってやったことがあるので
大丈夫だと思いますが、関数内部とか見分けないとできないような。うーん。


パターンマッチングが、ぜんぜんわかりません。
どーしたらいいんだろう。