diff --git a/functions.c b/functions.c index 9df2dab..b2567f5 100644 --- a/functions.c +++ b/functions.c @@ -43,6 +43,7 @@ void lenv_add_builtin_funcs(lenv* env) { lenv_add_builtin(env, "head", builtin_head); lenv_add_builtin(env, "tail", builtin_tail); lenv_add_builtin(env, "if", builtin_if); + lenv_add_builtin(env, "print", builtin_print); //ENV Functions lenv_add_builtin(env, "def", builtin_def); @@ -53,6 +54,7 @@ void lenv_add_builtin_funcs(lenv* env) { lenv_add_builtin(env, "\\", builtin_lambda); lenv_add_builtin(env, "load", builtin_load); lenv_add_builtin(env, "loadonce", builtin_loadonce); + lenv_add_builtin(env, "error", builtin_error); } char* builtin_op_strname(BUILTIN_OP_TYPE op) { @@ -360,6 +362,14 @@ lval* builtin_if(lenv* env, lval* val) { return result; } +lval* builtin_print(lenv* env, lval* val) { + for(int i = 0; i < val->cell_count; i++) { + lval_print(val->cell_list[i]); + putchar(' '); + } + putchar('\n'); + return lval_ok(); +} //End List/Util functions //Start ENV Functions @@ -512,4 +522,12 @@ lval* builtin_do_load(lenv* env, lval* val, BOOL loadonce) { return err; } } +lval* builtin_error(lenv* env, lval* val) { + LASSERT_ARG_COUNT("error", val, val, 1); + LASSERT_TYPE("error", val, val->cell_list[0], LVAL_STR); + + lval* errorVal = lval_err_detail(LERR_USER, "%s", val->cell_list[0]->data.str); + lval_delete(val); + return errorVal; +} //End ENV Functions \ No newline at end of file diff --git a/functions.h b/functions.h index e88a6fb..1b2e10a 100644 --- a/functions.h +++ b/functions.h @@ -58,6 +58,7 @@ extern "C" { lval* builtin_head(lenv* env, lval* val); lval* builtin_tail(lenv* env, lval* val); lval* builtin_if(lenv* env, lval* val); + lval* builtin_print(lenv* env, lval* val); //ENV Functions lval* builtin_envdef(lenv* env, lval* val, char* type); @@ -69,6 +70,7 @@ extern "C" { lval* builtin_load(lenv* env, lval* val); lval* builtin_loadonce(lenv* env, lval* val); lval* builtin_do_load(lenv* env, lval* val, BOOL loadonce); + lval* builtin_error(lenv* env, lval* val); #ifdef __cplusplus } diff --git a/lang.c b/lang.c index c5e581e..bd77cf8 100644 --- a/lang.c +++ b/lang.c @@ -10,7 +10,7 @@ mpc_ast_t* tokenize(char *input) { if (!mpc_parse("", input,gLispy, &result)) { success = 0; - mpc_err_print(result.error); + mpc_err_print_to(result.error, stderr); mpc_err_delete(result.error); } diff --git a/lval.h b/lval.h index 86869ed..00626eb 100644 --- a/lval.h +++ b/lval.h @@ -26,7 +26,7 @@ typedef struct lval_func lval_func; #define LVAL_IS_FALSE(val) (val->type == LVAL_NUM && fabs(val->data.num) <= DBL_EPSILON) enum VAL_TYPE { LVAL_ERR, LVAL_NUM, LVAL_SYM, LVAL_FUNC, LVAL_S_EXPR, LVAL_Q_EXPR, LVAL_EXIT, LVAL_STR, LVAL_OK }; -enum VAL_ERROR { LERR_DIV_ZERO, LERR_BAD_OP, LERR_BAD_NUM, LERR_BAD_SYM, LERR_OTHER, LERR_SYNTAX }; +enum VAL_ERROR { LERR_DIV_ZERO, LERR_BAD_OP, LERR_BAD_NUM, LERR_BAD_SYM, LERR_OTHER, LERR_SYNTAX, LERR_USER }; typedef enum VAL_TYPE VAL_TYPE; typedef enum VAL_ERROR VAL_ERROR; diff --git a/main.c b/main.c index 79373bd..86e7edf 100644 --- a/main.c +++ b/main.c @@ -128,18 +128,18 @@ void lval_print(lval* val) { } break; case LVAL_ERR: - printf("Error: "); switch(val->data.err.num) { - case LERR_DIV_ZERO: printf("Divide By Zero"); break; - case LERR_BAD_NUM: printf("Bad Number"); break; - case LERR_BAD_OP: printf("Invalid Operator"); break; - case LERR_BAD_SYM: printf("Unknown/Invalid Symbol"); break; - case LERR_OTHER: printf("Unknown Error"); break; - case LERR_SYNTAX: printf("Syntax Error"); break; - default: printf("Unknown Error"); break; + 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) { - printf(", %s", val->data.err.detail); + fprintf(stderr,": %s", val->data.err.detail); } break; }