summaryrefslogtreecommitdiff
path: root/lisp.c
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 /lisp.c
parentc3273084cc4b1fa4657a5e52590825fd114841e4 (diff)
more pretty printing
Diffstat (limited to 'lisp.c')
-rw-r--r--lisp.c41
1 files changed, 22 insertions, 19 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) {