From 85e9fef4aa8855b6660ce8c8cc8d6f5fb0d507b6 Mon Sep 17 00:00:00 2001 From: Felix Perktold Date: Sun, 21 Dec 2025 23:05:40 +0100 Subject: more pretty printing --- lisp.c | 41 ++++++++++++++++++++++------------------- lisp.h | 1 + lisp.l | 3 ++- lisp.y | 6 ++++-- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/lisp.c b/lisp.c index f107bea..22e90b5 100644 --- a/lisp.c +++ b/lisp.c @@ -70,8 +70,7 @@ value *car(value *cons) { return cons->as.pair.car; } printf("not a pair: "); - print_value(cons); - printf("\n"); + println_value(cons); return make_nil(); } @@ -80,11 +79,14 @@ value *cdr(value *cons) { return cons->as.pair.cdr; } printf("not a pair: "); - print_value(cons); - printf("\n"); + println_value(cons); return make_nil(); } +void *println_value(value *val){ + print_value(val); + printf("\n"); +} void *print_value(value *val){ char *str; switch (val->type) { @@ -93,7 +95,7 @@ void *print_value(value *val){ break; case VT_DOUBLE: - printf("%f", val->as.d); + printf("%g", val->as.d); break; case VT_SYMBOL: @@ -186,9 +188,9 @@ value *env_lookup(env *e, const char *sym) { } value *eval(env *e, value *v) { - printf("evaluating: "); - print_value(v); - printf("\n"); + //printf("evaluating: "); + //print_value(v); + //printf("\n"); if (v->type == VT_NIL) { return v; @@ -225,8 +227,7 @@ value *eval_pair(env *e, value *v) { if (defname->type != VT_SYMBOL) { printf("error, expected symbol, found: "); - print_value(defname); - printf("\n"); + println_value(defname); return v; } env_define(e, defname->as.sym, defval); @@ -252,6 +253,12 @@ value *eval_pair(env *e, value *v) { return make_nil(); } + if (head->type == VT_SYMBOL && !strcmp(head->as.sym, "print")) { + value *v = eval(e, car(tail)); + println_value(v); + return v; + } + value *head_eval = eval(e, head); if (head_eval->type == VT_BUILTIN) { return head_eval->as.builtin.fn(e, tail); @@ -281,7 +288,7 @@ value *apply(value *lval, value *args) { value *builtin_cons(env *e, value *args) { value *v = eval(e, car(args)); - return cons(v, car(cdr(args))); + return cons(v, eval(e, car(cdr(args)))); } value *builtin_car(env *e, value *args) { @@ -309,8 +316,7 @@ value *apply_to_nums(env *e, value *args, double (*fn)(double, double)) { result = v->as.d; } else { printf("not a number: "); - print_value(v); - printf("\n"); + println_value(v); return make_nil(); } @@ -323,8 +329,7 @@ value *apply_to_nums(env *e, value *args, double (*fn)(double, double)) { result = fn(result, v->as.d); } else { printf("not a number: "); - print_value(v); - printf("\n"); + println_value(v); return make_nil(); } args = cdr(args); @@ -366,8 +371,7 @@ value *builtin_le(env *e, value *args) { prev_num = v->as.d; } else { printf("not a number: "); - print_value(v); - printf("\n"); + println_value(v); return make_nil(); } @@ -381,8 +385,7 @@ value *builtin_le(env *e, value *args) { cur_num = v->as.d; } else { printf("not a number: "); - print_value(v); - printf("\n"); + println_value(v); return make_nil(); } if(prev_num > cur_num) { diff --git a/lisp.h b/lisp.h index b7e5a94..2e95fb9 100644 --- a/lisp.h +++ b/lisp.h @@ -49,6 +49,7 @@ value *car(value *cons); value *cdr(value *cons); void *print_value(value *val); +void *println_value(value *val); // environments, TODO: make this use hashtable // symbol->val typedef struct env { diff --git a/lisp.l b/lisp.l index 5ad5c57..20b64af 100644 --- a/lisp.l +++ b/lisp.l @@ -7,7 +7,8 @@ int tcnt = 0; %} %% -[[:space:]]+ { /*ignore whitespace*/} +[[:space:]]+ { /* ignore whitespace */ } +";"[^\n]* { /* ignore comment */ } "(" { return LPAREN; } ")" { return RPAREN; } "\." { return DOT; } diff --git a/lisp.y b/lisp.y index e8dd961..734bfa2 100644 --- a/lisp.y +++ b/lisp.y @@ -25,11 +25,13 @@ int yyerror(const char *s); %% sexprs: sexpr { - print_value(eval(global_env, $1)); printf("\n"); + printf(";> "); + println_value(eval(global_env, $1)); } | sexprs sexpr { - print_value(eval(global_env, $2)); printf("\n"); + printf(";> "); + println_value(eval(global_env, $2)); }; sexpr: atom -- cgit v1.2.3