Schemeでconsは失敗するか

 Schemeみたいにメモリ管理を隠蔽してしまっている言語では、メモリ確保に失敗した場合にどうすればいいのだろう。例えば、consをしようとすると新しいメモリ領域が必要になってくるので、consにはわずかながら失敗の可能性がある。
 というか、よく考えたらconsが失敗するところって見たことがない。これは実験してみなければ。
 というわけで、failmallocを使ってgoshを起動してみたのだが、*** SYSTEM-ERROR: couldn't get home directory. とかエラーを吐くものの、起動する。しかも、(define a (cons 0 1))とかやってもちゃんと動く。どうも、メモリ確保にmallocを使ってない気がする。Boehm GCだし。
 ソースを読んでみたところ、Boehm GCはsbrk(場合によってはmmapも使ってる?)でメモリを確保しているみたいだ。という事は、sbrkを上書きすればメモリ確保を失敗させられると思われるが、そんな事をするとインタプリタ自体が起動しなくなる気がする。そもそも目的はconsが失敗したらどうなるかを知ることなので、処理系自体は起動してくれないと困る。
 というわけで、実際にコードを改造して実験することはあきらめて、コードを読んでみた。Gaucheでは、consに対応するCの関数はScm_Consになっている。この関数は短いので、中身を全部引用してみる。

   ScmPair *z;
    SCM_MALLOC_WORDS(z, sizeof(ScmPair)/sizeof(GC_word), ScmPair*);
    SCM_SET_CAR(z, car);
    SCM_SET_CDR(z, cdr);
    return SCM_OBJ(z);

 SCM_MALLOC_WORDSはマクロであり、GC_MALLOC_WORDSを呼んでいる。GC_MALLOC_WORDSがメモリ確保失敗時にNULLを返すなら、zはNULLになるはずだ。次に、SCM_SET_CARはどうなっているかだが、マクロを展開するとz->car = carになる。NULL checkは特に行われていないので、たぶんここでSegmantation faultを起こすことになるのではないかと思われる。
 結論としては、consが失敗したらsegvで落ちるので、consの戻り値をチェックするコードを書いても意味がないという事になる、のだろうか。
 しかし、Scm_ConsにNULL checkを入れるべきである、と提案するべきであるのかどうかはちょっとわからない。メモリが少なくなってきたらGCが超頑張って、それでもダメならsegv、というのはそれはそれで割りきりとしてアリなのではなかろうか。segvして欲しくなけりゃスワップに10GBぐらい割り当てとけよ、と。メモリ確保の失敗に関する考察を読んでも、segvでいいじゃん、という意見に対して「しかしながら、それは「メモリ保護機能がきちんとした」システムにのみ適用できることだ。 」と反論してある。Gaucheをまともに動かせるようなシステムはメモリ保護機能はついていると期待してもよいのではなかろうか。
 ああ、でもやっぱり、エラー処理をしたい時もあるな。そういう時にはconsが失敗しただけで死ぬのは困る気がする。そもそもconsが失敗したら何が返るべきなのか。よくわからない。