void add_bind_to_env(lisp_object* env, lisp_object* sym, lisp_object* obj) { lisp_object* tmp = create_cons(); //env must be ((dummy . dummy) (a . 1) (b . 3) ...) set_cdr(tmp, get_cdr(env)); set_cdr(get_cdr(env), tmp); set_car(tmp, create_cons()); set_car(get_car(tmp), sym); set_cdr(get_car(tmp), obj); return; }
void create_env() { //env must be ((dummy . dummy) (a . 1) (b . 3) ...) env = create_cons(); set_car(env, create_cons()); set_cdr(env, create_empty_list()); add_bind_to_env(env, create_symbol("car"), create_subr(LF_car)); add_bind_to_env(env, create_symbol("cdr"), create_subr(LF_cdr)); add_bind_to_env(env, create_symbol("atom?"), create_subr(LF_cons)); add_bind_to_env(env, create_symbol("eq?"), create_subr(LF_eq)); add_bind_to_env(env, create_symbol("quote"), create_fsubr(LF_quote)); return; }
lisp_object* evls(lisp_object* arg, lisp_object* env) { lisp_object *op, *tmp, *ret; tmp = ret = create_cons(); add_protect(ret); for(op = arg; !null(op); op = get_cdr(op)){ set_cdr(tmp, create_cons()); tmp = get_cdr(tmp); add_protect(tmp); set_car(tmp,eval(op, env)); } set_cdr(tmp, create_empty_list()); return get_cdr(ret); }
lisp_object* LF_cons(lisp_object* obj) { lisp_object* cons = create_cons(); set_car(cons, get_car(obj)); set_cdr(cons, get_car(get_cdr(obj))); return cons; }
object_t *make_arguments(object_t *args, object_t *env) { if (nilp(args)) { return get_nil(); } else { return create_cons(eval(car(args), env), make_arguments(cdr(args), env)); } }
int main() //@ : main //@ requires true; //@ ensures true; //@ terminates; { //@ produce_call_below_perm_(); //@ call_below_perm__elim(main); //@ produce_call_below_perm_(); //@ call_below_perm__elim(main); //@ produce_call_below_perm_(); //@ call_below_perm__elim(main); //@ produce_call_below_perm_(); //@ call_below_perm__elim(main); //@ produce_call_below_perm_(); //@ call_below_perm__elim(main); //@ produce_call_below_perm_(); //@ call_below_perm__elim(main); //@ produce_call_below_perm_(); //@ call_below_perm__elim(main); //@ produce_call_below_perm_(); //@ call_below_perm__elim(main); //@ produce_call_below_perm_(); //@ call_below_perm__elim(main); //@ produce_call_below_perm_(); //@ call_below_perm__elim(main); void *l = create_nil(); l = create_cons(3, l); l = create_cons(2, l); l = create_cons(1, l); list_object_contains(l, 2); //@ split_fraction list_object(l, _, _, _, _); list_object_intersects(l, l); void *l2 = create_nil(); l2 = create_cons(2, l2); l2 = create_cons(4, l2); list_object_intersects(l, l2); //@ leak list_object(l, _, _, _, _); //@ leak list_object(l2, _, _, _, _); return 0; }
object_t *prim_cons(object_t *arguments) { object_t *first = car(arguments); object_t *second = car(cdr(arguments)); return create_cons(first, second); }