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時間もはまってしまった。

追記

もう一つ発見。
Common Lisp では nil の cdr は nil

>>(cdr nil)

NIL