とかきつつ GC の習作

int
main(int argc, char **argv)
{
        int v;
        Cell *cell, *top, *iter;
        top = cell = iter = alloc8.alloc();
        v = top->car = 12;
        while ( cell = alloc8.alloc()) {
                iter->cdr = cell;
                cell->car = ++v;
                iter = cell;
        }
        iter = top;
        while ( iter ) {
                printf("iter 0x%x: %d\n", iter, iter->car);
                if ( iter->car  == (12 + 3)) {
                        printf("gc\n");
                        gc();
                }
                if ( iter->car < 0 ) {
                        iter = iter->cdr->cdr;
                } else {
                        iter = iter->cdr;
                }
        }
}

このソースで言えば

    if ( iter->car < 0 ) {
        iter = iter->cdr->cdr;
    } else {
        iter = iter->cdr;
    }

が重要。iter->car < 0 となっているが car < 0 は意味がなくて moved したかどうかのチェック。これをスマートポインタの中に入れてしまえば iter = iter->cdr となってほんとうにスマート(いやスリムか?)に見える。