一応動くが、汚い。
一応出来たものの、設計もコードもすこぶる汚い。最適化もなし。それを弄りまくって超低機能数式コンパイラも作ってみた。それも汚い。でき上がるアセンブラもかなり冗長。例えばソースと、それから生成されるアセンブラは以下のようになる。
文法は簡単だから分かると思うけど、">>"は出力を意味していて、右に続くものを順に評価して出力する。
foreach x (1 .. 3) { foreach y (1 .. 2 .. 6) { >> "x + y = " (z = (x + y)) ", z = " (z); } } # 出力は以下の通り x + y = 2, z = 2 x + y = 4, z = 4 x + y = 6, z = 6 x + y = 3, z = 3 x + y = 5, z = 5 x + y = 7, z = 7 x + y = 4, z = 4 x + y = 6, z = 6 x + y = 8, z = 8
#一部省略 .LC0: .string "x + y = " .LC1: .string ", z = " .LC2: .string "?n" .LC3: .string "%d" .text .globl main .type main,@function main: pushl %ebp movl %esp, %ebp subl $12, %esp movl $1, -4(%ebp) .L0: movl $1, -8(%ebp) .L1: pushl $.LC0 call printf movl -4(%ebp), %eax movl -8(%ebp), %ebx addl %ebx, %eax movl %eax, -12(%ebp) pushl %eax pushl $.LC3 call printf pushl $.LC1 call printf movl -12(%ebp), %ebx pushl %ebx pushl $.LC3 call printf pushl $.LC2 call printf addl $2, -8(%ebp) cmpl $6, -8(%ebp) jle .L1 incl -4(%ebp) cmpl $3, -4(%ebp) jle .L0 movl $1, %eax leave ret .Lfe1: .size main,.Lfe1-main .ident "JKlein: (MathC) 0.0.1 20040718"
アセンブラ読める人は分かるけど、このコードだと変数のスコープが無い。すべてグローバルだから、書き方としては一番楽なんだけど非常に気持ち悪い。それと最適化とかの前に算術コードをもっとうまくやるべきだな。レジスタの使い方が手抜きすぎる。これに関しては、わりと楽に改善できるはず。