- ao_lisp_root_add(&ao_lisp_cons_type, &cdr);
- ao_lisp_root_poly_add(&car);
- cons = ao_lisp_alloc(sizeof (struct ao_lisp_cons));
- ao_lisp_root_clear(&car);
- ao_lisp_root_clear(&cdr);
- if (!cons)
- return NULL;
+ if (ao_lisp_cons_free_list) {
+ cons = ao_lisp_cons_free_list;
+ ao_lisp_cons_free_list = ao_lisp_poly_cons(cons->cdr);
+ } else {
+ ao_lisp_poly_stash(0, car);
+ ao_lisp_cons_stash(0, cdr);
+ cons = ao_lisp_alloc(sizeof (struct ao_lisp_cons));
+ car = ao_lisp_poly_fetch(0);
+ cdr = ao_lisp_cons_fetch(0);
+ if (!cons)
+ return NULL;
+ }