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));
--- a/src/types.h	Tue Sep 03 12:57:53 2019 +0200
+++ b/src/types.h	Tue Sep 03 14:06:29 2019 +0200
@@ -69,7 +69,8 @@
     YBUILTIN_DIV = 7,
 
     YBUILTIN_IF = 8,
-    YBUILTIN_SEQ = 9,
+
+    YBUILTIN_PRINT = 9,
 
     YBUILTIN_EQ = 10,
     YBUILTIN_LT = 11,