Mercurial > lbo > hg > ylisp
changeset 152:88fec15abdbc
built-ins: Implement print, fix minor bugs
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Tue, 03 Sep 2019 14:06:29 +0200 |
parents | fe5d01fa28ee |
children | 775a941b036c |
files | src/built-ins.c src/eval.c src/expr.c src/types.h |
diffstat | 4 files changed, 26 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/built-ins.c Tue Sep 03 12:57:53 2019 +0200 +++ b/src/built-ins.c Tue Sep 03 14:06:29 2019 +0200 @@ -23,7 +23,7 @@ {"let", YBUILTIN_LET}, {"defn", YBUILTIN_DEFN}, {"+", YBUILTIN_PLUS}, {"-", YBUILTIN_MINUS}, {"*", YBUILTIN_MULT}, {"/", YBUILTIN_DIV}, - {"if", YBUILTIN_IF}, {"seq", YBUILTIN_SEQ}, + {"if", YBUILTIN_IF}, {"print", YBUILTIN_PRINT}, {"==", YBUILTIN_EQ}, {"<", YBUILTIN_LT}, {"car", YBUILTIN_CAR}, {"cdr", YBUILTIN_CDR}, {"push", YBUILTIN_PUSH}, {"raise", YBUILTIN_RAISE}, @@ -332,6 +332,26 @@ #undef _pattern } +yexpr_t ybuiltin_fn_print(yeval_state_t* state) { +#define _pattern "(print expr [expr...])" + yexpr_t print; + + if (!yvec_pop(&state->call_stack, &print)) NOTENOUGHFAIL(PRINT); + if (print.typ != YEXPR_LIST) BADEXPRFAIL(PRINT, print); + if (print.value.list.len < 1) BADEXPRFAIL(PRINT, print); + + for (size_t i = 1; i < print.value.list.len; i++) { + yexpr_t evald = yeval(state, YVEC_AT(&print.value.list, i, yexpr_t), false); + ystr_t repr = yexpr_debug_str(&evald); + fputs(ystr_str(&repr), stdout); + yexpr_destroy(&evald); + ystr_destroy(&repr); + } + + return yexpr_new(); +#undef _pattern +} + yexpr_t ybuiltin_fn_eq(yeval_state_t* state) { #define _pattern "(== expr expr [expr...])" yexpr_t eq = yexpr_new(); @@ -366,7 +386,7 @@ ybuiltin_fn_let, NULL, ybuiltin_fn_plus, ybuiltin_fn_minus, ybuiltin_fn_times, NULL, - ybuiltin_fn_if, NULL, + ybuiltin_fn_if, ybuiltin_fn_print, ybuiltin_fn_eq}; const char* ybuiltin_name(YBUILTIN_TYPE t) {
--- a/src/eval.c Tue Sep 03 12:57:53 2019 +0200 +++ b/src/eval.c Tue Sep 03 14:06:29 2019 +0200 @@ -81,7 +81,7 @@ } // Undefined reference! - yexpr_t exception; + yexpr_t exception = yexpr_new(); ystr_t msg = ystr_new("Undefined reference!"); yexpr_set_exception(&exception, msg); return exception;
--- a/src/expr.c Tue Sep 03 12:57:53 2019 +0200 +++ b/src/expr.c Tue Sep 03 14:06:29 2019 +0200 @@ -215,7 +215,7 @@ ystr_build(&tmp, "%lld", expr->value.n); break; case YEXPR_STRING: - ystr_append(&tmp, &expr->value.str); + ystr_build(&tmp, "\"%s\"", ystr_str(&expr->value.str)); break; case YEXPR_ATOM: ystr_build(&tmp, "%s", yatom_name(expr->value.atom));