インストラクション
直前エントリにて_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/
追記
そういえば、って失礼だなぁ。スミマセン (汗