summaryrefslogtreecommitdiff
path: root/lisp.c
diff options
context:
space:
mode:
Diffstat (limited to 'lisp.c')
-rw-r--r--lisp.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/lisp.c b/lisp.c
index cbb54ed..324eeb6 100644
--- a/lisp.c
+++ b/lisp.c
@@ -91,16 +91,8 @@ value *force_thunk(value *v) {
return v;
}
if(v->as.thunk.cached) {
- printf("\nDEBUG: thunk ");
- print_value(v->as.thunk.expr);
- printf(" was already cached as: ");
- println_value(v->as.thunk.cached);
return v->as.thunk.cached;
}
- printf("\nDEBUG: thunk ");
- print_value(v->as.thunk.expr);
- printf(" is now cached as: ");
- println_value(v->as.thunk.cached);
v->as.thunk.cached = eval(v->as.thunk.env, v->as.thunk.expr);
return v;
@@ -169,22 +161,21 @@ void print_value(value *val) {
break;
case VT_PAIR:
- // DOTTED:
- //printf("(");
- //print_value(val->as.pair.car);
- //printf(" . ");
- //print_value(val->as.pair.cdr);
- //printf(")");
-
- // LISTS:
printf("(");
- print_value(car(val));
+ print_value(force_thunk(car(val)));
value *p_cdr = cdr(val);
- while (p_cdr->type == VT_PAIR) {
+ while (p_cdr->type == VT_PAIR || p_cdr->type == VT_THUNK) {
+ while (p_cdr->type == VT_THUNK) {
+ p_cdr = force_thunk(p_cdr);
+ }
+ if (p_cdr->type != VT_PAIR) {
+ break;
+ }
printf(" ");
print_value(car(p_cdr));
p_cdr = cdr(p_cdr);
}
+
if(p_cdr->type != VT_NIL) {
printf(" . ");
print_value(p_cdr);