インストラクション
直前エントリにて_Gauche の vm.c 見てるんですがどれも微妙_と残してるんですが、わしレベルの適当なインストラクションが無くって、と。
で、Reading Gauche の VM インストラクションなドキュメント見てるに_PUSH も近いうちに読みましょう_との記述を発見。
これだ!!と言いつつも disasm で PUSH なインストラクションが出てくる場面がイメージできない。やっぱレベル的に微妙だよ、と思いつつ google 先生にお伺いを立ててみると shiro さんが書かれたドキュメントに hit した。
以下でナニ
gosh> (define (fold proc seed lis) (define (loop seed lis) (if (null? lis) seed (loop (proc seed (car lis)) (cdr lis)))) (loop seed lis)) fold gosh> (disasm fold) main_code (name=fold, code=0x8145d80, size=22, const=0, stack=23): args: #f 0 LREF1-PUSH ; seed 1 LREF0-PUSH ; lis 2 LOCAL-ENV(2) ; (loop seed lis) 3 LREF0 ; lis 4 BNNULL 8 ; (null? lis) 6 LREF1 ; seed 7 RET 8 PRE-CALL(2) 15 10 LREF1-PUSH ; seed 11 LREF0 ; lis 12 CAR-PUSH ; (car lis) 13 LREF12 ; proc 14 CALL(2) ; (proc seed (car lis)) 15 PUSH 16 LREF0 ; lis 17 CDR-PUSH ; (cdr lis) 18 LOCAL-ENV-JUMP(1) 3 ; (loop (proc seed (car lis)) (cdr lis)) 20 RET 21 RET #<undef> gosh>
む。再帰な手続き呼び出しの引数で手続きをナニすりゃ良いのかな。
とりあえず
PUSH なインストラクションに立候補しておきます。
そういえば
ひげぽんさん、Monar 0.0.1 リリースおめでとうございます♪
http://code.google.com/p/monar/
追記
そういえば、って失礼だなぁ。スミマセン (汗