#gosh> ((lambda (x y)) 'a 'a)
0
#の方が正しくて(と言うか正しくないから0が返ってきて)、qwerの方はたまたま2が返ってきただけなのですね。
ありがとうございます。
#qwerも((lambda (x y)) 'a 'a)もScheme的には不正なプログラムなので未定義動作です。現在のGauche VMは手続き呼び出し直前にレジスタval0 (x86の%raxみたいなもの) に引数の数を入れてるので2はそれが見えてますね。((lambda (x y) 'a 'a)の方は最適化でlambdaが消えて何もしないコードになってるので、大元のevalの呼び出しのどっかで0がセットされてるのが残ってるんだと思います。
#lambda の構文自体においては body が空というのは特に有用に使える場面はなさそうですが、ラムダに展開されるマクロなどで寛容にした方が楽な場面があるというような判断なんでしょうか?
#空のbodyを積極的に許したいわけじゃないんですが、(lambda () (begin (begin (begin) (begin (begin) (begin)))))みたいな形で空のbodyに展開される可能性があるんですよね。spliceした後でもういちど確認すればいいんだけどそこをサボってます。
#なるほど。 言語デザインとしての選択ではなく実装上の都合なわけですね。