summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp.c22
-rw-r--r--lisp.h2
-rw-r--r--main.c2
3 files changed, 13 insertions, 13 deletions
diff --git a/lisp.c b/lisp.c
index 5f5a6fb..b880eb3 100644
--- a/lisp.c
+++ b/lisp.c
@@ -69,19 +69,19 @@ value *cons(value *car, value *cdr) {
}
value *car(value *cons) {
- if (cons->type == VT_PAIR) {
+ if (cons && cons->type == VT_PAIR) {
return cons->as.pair.car;
}
- printf("not a pair: ");
+ printf("car of non-pair: ");
println_value(cons);
return make_nil();
}
value *cdr(value *cons) {
- if (cons->type == VT_PAIR) {
+ if (cons && cons->type == VT_PAIR) {
return cons->as.pair.cdr;
}
- printf("not a pair: ");
+ printf("cdr of non-pair: ");
println_value(cons);
return make_nil();
}
@@ -194,9 +194,9 @@ value *eval(env *e, value *v) {
//printf("evaluating: ");
//print_value(v);
//printf("\n");
-
- if (v->type == VT_NIL) {
- return v;
+
+ if (!v || v->type == VT_NIL) {
+ return make_nil();
}
if (v->type == VT_PAIR) {
@@ -231,7 +231,7 @@ value *eval_pair(env *e, value *v) {
if (defname->type != VT_SYMBOL) {
printf("error, expected symbol, found: ");
println_value(defname);
- return v;
+ return make_nil();
}
env_define(e, defname->as.sym, defval);
return defval;
@@ -275,7 +275,7 @@ value *eval_pair(env *e, value *v) {
}
value *apply(env *e, value *lval, value *args) {
- env *sub_env = env_create(e);
+ env *sub_env = env_create(lval->as.lambda.env);
value *params = lval->as.lambda.params;
value *arg = args;
@@ -409,7 +409,7 @@ value *builtin_div(env *e, value *args) {
return apply_to_nums(e, args, div_fn);
}
-value *builtin_le(env *e, value *args) {
+value *builtin_lt(env *e, value *args) {
double prev_num;
value *v = eval(e, car(args));
@@ -436,7 +436,7 @@ value *builtin_le(env *e, value *args) {
println_value(v);
return make_nil();
}
- if(prev_num > cur_num) {
+ if(prev_num >= cur_num) {
return make_nil();
}
prev_num = cur_num;
diff --git a/lisp.h b/lisp.h
index 7c9dd79..162da09 100644
--- a/lisp.h
+++ b/lisp.h
@@ -79,7 +79,7 @@ value *builtin_add(env *e, value *args);
value *builtin_sub(env *e, value *args);
value *builtin_mul(env *e, value *args);
value *builtin_div(env *e, value *args);
-value *builtin_le(env *e, value *args);
+value *builtin_lt(env *e, value *args);
int is_integer(double x);
diff --git a/main.c b/main.c
index 4f00b5d..2d258af 100644
--- a/main.c
+++ b/main.c
@@ -37,7 +37,7 @@ int main(int argc, char **argv) {
env_define(global_env, "-", make_builtin(builtin_sub));
env_define(global_env, "*", make_builtin(builtin_mul));
env_define(global_env, "/", make_builtin(builtin_div));
- env_define(global_env, "<=", make_builtin(builtin_le));
+ env_define(global_env, "<", make_builtin(builtin_lt));
// evaluate files
for(int i = 1; i < argc; i++) {