Gauche > Archives > 2020/07/12

2020/07/12 14:36:58 UTCtioner
#
(define qwer (lambda (x y)))
gosh> (qwer 'a 'a)
2
なのに
gosh> ((lambda (x y)) 'a 'a)
0
なのは何故でしょうか。
2020/07/12 15:05:12 UTCkaki
#
未定義動作だからです。多分Gaucheの場合は、そのときVMレジスタに偶然残っていた値が返ります。
2020/07/12 21:58:03 UTCshiro
#
Scheme (rnrs) 的には、lambdaの中に最低一つの式が必要です。なのでエラーなんですが、Gaucheはあんまりエラーにうるさくありません。で、空のbodyでなにが起きているかというと…
#
gosh> (define qwer (lambda (x y)))
qwer
gosh> (disasm qwer)
CLOSURE #<closure (qwer x y)>
=== main_code (name=qwer, cc=0x7f94e6453780, codevec=0x7f94e645bb50, size=1, const=0 stack=0):
signatureInfo: ((qwer x y))
     0 RET
#
本体がreturnだけの手続きにコンパイルされているので、偶然レジスタに残っていた値が戻り値として見えます。