OnLisp を読んで Scheme と Common Lisp の違いにはまる
On Lispの、とある Common Lisp のコードを Scheme に変換して打ち込んでいたのですが if の違いに気づかずハマりました。
if は Scheme でも Common Lisp でも
(if test consequent alternate)
のような形式です。
ただ alternate が省略されたときの振舞いが違うようです。
Scheme では R5RS でその場合の戻り値は未規定であると明記されています。
Gauche の場合は
gosh> (if #f #t) => #<undef>
#
Common Lisp は全然詳しくないのですが手元の gcl では
>>(if nil t) NIL
NIL が返るようです。
これが何で問題かというと NIL は明らかに「偽」なのですが、未規定な値は「真」とも「偽」とも決められず実装依存です。
実際 Gauche では
gosh> (if (if #f #t) "true" "false") => "true"
のように「真」になっていて、Common Lisp と逆です。
2時間もはまってしまった。