むむ
覚えてないのか理解が微妙なママなのかも不明ですが、フォロー頂いた事項について確認してみます。
頂いたコメントは_一個目はスタックにつんで二個目は VAL0 に入れる (VAL0 に関数オブジェクト、スタックに関数の引数) から、このようなコンパイル結果になると思います_との事。
これは
0 LREF2-PUSH ; x 1 LREF(1,5) ; a 2 TAIL-CALL(1) ; (a x) 3 RET
の一個目二個目を指してる、と見て良いのだろうか。そーゆー意味では
(disasm (lambda (a b c d e f) (lambda (x y z) (a x y))))
だと x と y が push されて a は val0 に入ると見て確認
gosh> (disasm (lambda (a b c d e f) (lambda (x y z) (a x y)))) main_code (name=#f, code=0x80d68b0, size=3, const=1, stack=0): args: #f 0 CLOSURE #<lambda 0> ; (lambda (x y z) (a x y)) 2 RET internal_closure_0 (name=#f, code=0x80d7b40, size=5, const=0 stack=5): args: #f 0 LREF2-PUSH ; x 1 LREF1-PUSH ; y 2 LREF(1,5) ; a 3 TAIL-CALL(2) ; (a x y) 4 RET #<undef> gosh>
うむ。では逆に
(disasm (lambda (a b c d e f) (lambda (x y z) (x a y))))
だと LREF-PUSH(1, 5) されて LREF1-PUSH されるのか。確認。
0 LREF-PUSH(1,5) ; a 1 LREF1-PUSH ; y 2 LREF2 ; x 3 TAIL-CALL(2) ; (x a y) 4 RET
うーむ。この根拠は如何に、と思いつつそこまでナニするリキがあるかどうか。