// print an lval void lval_print(lval *v) { switch (v->type) { case LVAL_NUM: printf("%li", v->num); break; case LVAL_ERR: printf("Error: %s", v->err); break; case LVAL_SYM: printf("%s", v->sym); break; case LVAL_FUN: if (v->builtin) { printf("<builtin>"); } else { printf("(\\ "); lval_print(v->formals); putchar(' '); lval_print(v->body); putchar(')'); } break; case LVAL_SEXPR: lval_expr_print(v, '(', ')'); break; case LVAL_QEXPR: lval_expr_print(v, '{', '}'); break; } }
// Print an "lval" void lval_print(lval* v) { switch(v->type) { case LVAL_NUM: printf("%li", v->num); break; case LVAL_ERR: printf("Error: %s", v->err); break; case LVAL_SYM: printf("%s", v->sym); break; case LVAL_SEXPR: lval_expr_print(v, '(', ')'); break; case LVAL_QEXPR: lval_expr_print(v, '{', '}'); break; } }
void lval_print(lval* val) { switch(val->type) { case LVAL_NUM: printf("%g", val->data.num); break; case LVAL_SYM: printf("%s", val->data.sym); break; case LVAL_STR: lval_print_str(val); break; case LVAL_S_EXPR: lval_expr_print(val, "(", ")"); break; case LVAL_Q_EXPR: lval_expr_print(val, "{", "}"); break; case LVAL_EXIT: printf("exit"); break; case LVAL_OK: printf("ok"); break; case LVAL_FUNC: ; lval_func* func = val->data.func; if (func->builtin != NULL) { printf("<%s>", func->name); } else { printf("(<lambda> "); lval_print(func->formals); putchar(' '); lval_print(func->body); putchar(')'); } break; case LVAL_ERR: switch(val->data.err.num) { case LERR_DIV_ZERO: fprintf(stderr, "Divide By Zero"); break; case LERR_BAD_NUM: fprintf(stderr,"Bad Number"); break; case LERR_BAD_OP: fprintf(stderr,"Invalid Operator"); break; case LERR_BAD_SYM: fprintf(stderr,"Unknown/Invalid Symbol"); break; case LERR_OTHER: fprintf(stderr,"Unknown/Other Error"); break; case LERR_SYNTAX: fprintf(stderr,"Syntax Error"); break; case LERR_USER: fprintf(stderr,"Runtime Error"); break; default: fprintf(stderr,"Unknown Error"); break; } if (val->data.err.detail != NULL) { fprintf(stderr,": %s", val->data.err.detail); } break; } }