いつもながらさくっとメモる。今日もスタック言語からツリーに変換する方法について考えていた。最近は浜辺がお気に入りで、30 分クォーター二枚を駐車場のマシンに入れてブツクサ独り言を言いながら海の見える公園を行ったり来たりする。あまりにも考えすぎて、考えるうちに何故スタック言語に拘ってるのか分からなくなってきて、GUI で操作するなら最初からツリーが出来ているはずで、それをそのまま実行すればいいのでは?とかなんとか全部書くと長いのでそれでもスタックの部分はまあこれでいいやと思って、とりあえずツリーを作る所まで行った。どうやったかと言うと、スタック言語で 3 とか 4 とか数値をそのままスタックに入れる代わりに「ここに後で数字が入る」事を表現するコンテナを入れて、関数がやってきたら 3 + 4 とやる代わりにコンテナ+ コンテナをやって、結果は「あとで数字を書く」コンテナで、要するにインタプリタとコンパイラの違いみたいなもんだな。で、当たり前だけど数字の足し算と全く同じスタック言語でコンパイルも出来てしまうわけ。つまり、演算子の + はすぐ実行する時は二つの値を受け取って一つ返すけど、コンパイルする場合もやっぱり二つの変数を受け取って何がしか結果を一つ返すわけ。そんな事はパーサージェネレータを書いた5年も昔から知ってたんだけど、何の疑問も持たずそういう物だ思ってた。んだけど。
自然変換!圏論発見!
浜辺を歩くと自分の影も歩いてるわけ。
手を上げると影も手を上げる。
眼鏡を手に取ると影の眼鏡も手に繋がっていて、影の眼鏡だけ落ちたりしない。
3 + 4 の + は二つ数字を受け取って一つ返すわけ。
[a] [+] [b] は []を「あとで実行」と考えると、[+]も二つ受け取って一つ返す。
影と自分は違。影は物質ですらない。だけど、ある程度似ている。
自分から影を作る射があって、「歩く」という別種の射があるとする。
自分 -> 歩く -> 歩いている自分 | | V V 自分の影 -> 歩く影 -> 歩いている自分の影
「歩く」と「あるく影」は自然変換じゃ?今実行する + と後で実行する + も自然変換じゃ?なら、コンパイルも、全然特別な事じゃなくね?
そういう事なのかな?