u_object u_pair_create(u_object car, u_object cdr) { gc_push(car); gc_push(cdr); // all the pair created through gc module?? u_pair *pair = gc_alloc_hobject(); pair->type = U_PAIR; pair->val.pair.car = car; pair->val.pair.cdr = cdr; gc_pop(); // why pop ? what if no push, no pop? gc_pop(); return u_pair_to_obj(pair); // also the key point }
sexp_t *prim_append(sexp_t *args) { sexp_t *lst, *ret; if (list_len(args) == 0) return nil; if (isnil(car(args))) return prim_append(cdr(args)); if (isnil(cdr(args))) return copy_list(car(args)); if (!iscons(car(args)) || list_len(car(args)) < 0) { fprintf(stderr, "error: proper list expected\n"); return NULL; } for (ret = lst = copy_list(car(args)); cdr(lst) != nil; lst = cdr(lst)) ; gc_push(&ret); lst->data = make_cons(car(lst), prim_append(cdr(args))); gc_pop(); return ret; }