object *display_proc(object *arguments) { object *obj; char *str = NULL; obj = car(arguments); switch (obj->type) { case CHARACTER: printf("%c", obj->data.character.value); break; case FIXNUM: printf("%ld", obj->data.fixnum.value); break; case FLOATNUM: printf("%f", obj->data.floatnum.value); break; case STRING: printf("%s", str = obj->data.string.value); break; case SYMBOL: printf("%s", obj->data.symbol.value); break; case ERROR: printf("Error %ld: %s", obj->data.error.error_num, obj->data.error.error_msg); break; default: fprintf(stderr, "cannot display type\n"); } // switch return ok_symbol(); }
object *close_output_port_proc(object *arguments) { int result; result = fclose(car(arguments)->data.output_port.stream); if (result == EOF) { fprintf(stderr, "could not close output port\n"); exit(EXIT_FAILURE); } return ok_symbol(); }
object *write_char_proc(object *arguments) { object *character; FILE *out; character = car(arguments); arguments = cdr(arguments); out = is_empty(arguments) ? stdout : car(arguments)->data.output_port.stream; putc(character->data.character.value, out); fflush(out); return ok_symbol(); }
object *write_proc(object *arguments) { object *exp; FILE *out; exp = car(arguments); arguments = cdr(arguments); out = is_empty(arguments) ? stdout : car(arguments)->data.output_port.stream; write(out, exp); fflush(out); return ok_symbol(); }
object *eval_definition(object *exp, object *env) { define_variable(definition_variable(exp), eval(definition_value(exp), env), env); return ok_symbol(); }
object *eval_assignment(object *exp, object *env) { set_variable_value(assignment_variable(exp), eval(assignment_value(exp), env), env); return ok_symbol(); }
object *set_cdr_proc(object *arguments) { set_cdr(car(arguments), cadr(arguments)); return ok_symbol(); }