Exemplo n.º 1
0
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");
}
Exemplo n.º 2
0
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(")");
		}
	}
}