summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Perktold <Felix.Perktold@student.uibk.ac.at>2025-12-21 23:05:40 +0100
committerFelix Perktold <Felix.Perktold@student.uibk.ac.at>2025-12-21 23:05:40 +0100
commit85e9fef4aa8855b6660ce8c8cc8d6f5fb0d507b6 (patch)
tree4155495cac8198ed00539103009275028320fb4f
parentc3273084cc4b1fa4657a5e52590825fd114841e4 (diff)
more pretty printing
-rw-r--r--lisp.c41
-rw-r--r--lisp.h1
-rw-r--r--lisp.l3
-rw-r--r--lisp.y6
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