>>104

んー、cons呼ぶたびにmalloc(sizeof(pair)してちゃ遅す
ぎる(しメモリもムダだ)と思うぞ。mallocはいろんな大き
さ扱うためのオーバーへッドがあるから。

最近の処理系だとこんなじゃないか?

#define SET_TAG(x,tag) ((object *)((unsigned long)(x)+(tag)))

obj *cons(obj *car, obj *cdr)
{
 obj *value;
 if (heap_ptr + sizeof(pair) > heap_limit) {
  gc();
 }
 value = heap_ptr;
 heap_ptr += sizeof(pair);
 value->pair.car = car;
 value->pair.cdr = cdr;
 return SET_TAG(value, CONS_TAG);
}

まあ、コンパイルコードだと、上をインライン展開してあ
るだろうが…