data_t *apply(const data_t *proc, const data_t *args) { data_t *out; if(is_primitive_procedure(proc)) return apply_primitive_procedure(proc, args); if(is_compound_procedure(proc)) { out = eval_sequence( get_procedure_body(proc), extend_environment(get_procedure_parameters(proc), args, get_procedure_environment(proc))); return out; } printf("Unknown procedure type -- APPLY\n"); return make_symbol("error"); }
void print_data_rec(const data_t *d, int print_parens) { data_t *head, *tail; if(!d) printf("()"); else if(d == the_global_env) printf("<env>"); else { switch(d->type) { case prim_procedure: printf("<proc>"); break; case integer: printf("%d", d->integer); break; case decimal: printf("%g", d->decimal); break; case symbol: printf("%s", d->symbol); break; case string: printf("\"%s\"", d->string); break; case pair: if(is_compound_procedure(d)) { printf("<proc>"); break; } if(print_parens) printf("("); head = car(d); tail = cdr(d); if(tail) { print_data_rec(head, 1); if(tail->type != pair) { printf(" . "); print_data_rec(tail, 1); } else { printf(" "); print_data_rec(tail, 0); } } else { print_data_rec(head, 1); } if(print_parens) printf(")"); } } }