Nemerleのマクロの論文とか
http://nemerle.org/metaprogramming.pdf
そういえば、見てました。読むまでのレベルではないので。
9.1章が一番気になってたところなのですが、
一番重要なところの、アンクォート<[a]>ってのは、
aという構文木を出力する構文木を出力する構文であると言うことが分かりました。
自分で言っててよくわからないんだけど、単なるクォートでくくるだけではないって話でした。
Cのソースを出力するCのソースを出力するための構文であると言う感じですよ。<[ void main() { printf("aaa");} ]>
は、
printf("printf(\"void main() {printf(\\\"aaa\\\");}\");");
であるみたな話で、うわーって感じでした。中身はMLのデータ型ってかんじで書いてありましたが。
quote(void main() {printf("aaa");})
ってかんじじゃないんだって言う感じです。
自分が考えてるのは、<[ main:(void){void}:(){printf("aaa");} ]>
ってかんじのものが、
quote(:(:(main, (void)(@block(void)), ()(@block(printf("aaa"), ;))))
って感じになることを考えてるので、方向性が違うなと。思うのでした。
あと、カッコのカッコが分からない。これではやっぱり駄目なんじゃってのと、
いやいいんだってので、自分の中でいろいろと戦いがあります。
でも、とにかく、マクロの展開しようってところで、クォートしたのを、マクロ用関数テーブルみたいなのに
突っ込んで、実行ってやろうとしたときに、クロージャとして渡したらいいんだか、
遅延したらいいんだか、クォートして渡しただけにしたらいいんだか、
なんだか、わけがわからなくなってしまったのでとりあえずストップしてしまってます。
型が入るとワケワカメなので、まずは、schemeを作ってみろという感じ。
適当に移植したら、出来たけど、自分で作ったんじゃないから、よくわからない。
1から作ってみないとなぁと思ってるところです。
実は、lispのリードマクロでなんでも出来るんじゃとか。
lispのリードマクロの変体的活用はどこまでやられてたのだろう?