summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-12-05 09:14:05 -0800
committerKaz Kylheku <kaz@kylheku.com>2011-12-05 09:14:05 -0800
commit601a5312b0b65e519584888a0f861190959516d3 (patch)
treee222266538c44850cad63fa86703b6dc1b826f49 /eval.c
parent7fa8698dbec1812d13d8d7a1f323329baa9a10c4 (diff)
downloadtxr-601a5312b0b65e519584888a0f861190959516d3.tar.gz
txr-601a5312b0b65e519584888a0f861190959516d3.tar.bz2
txr-601a5312b0b65e519584888a0f861190959516d3.zip
* eval.c (op_cond): Fixed behavior for singleton clauses.
(eval_init): Use existing function objects car_f, cdr_f, eq_f, eql_f and equal_f. Added identity to function table. * lib.h (eql_f): Missing declaration added. * txr.1: Documented cond, and, if, or, defun, inc, dec, set, push and pop.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/eval.c b/eval.c
index e6ea4909..85176f7f 100644
--- a/eval.c
+++ b/eval.c
@@ -439,9 +439,11 @@ static val op_cond(val form, val env)
val iter = rest(form);
for (; iter; iter = cdr(iter)) {
- val pair = car(iter);
- if (eval(first(pair), env, form))
- return eval_progn(rest(pair), env, pair);
+ val group = car(iter);
+ val restgroup = rest(group);
+ val firstval = eval(first(group), env, group);
+ if (firstval)
+ return if3(restgroup, eval_progn(rest(group), env, group), firstval);
}
return nil;
@@ -1050,14 +1052,15 @@ void eval_init(void)
reg_fun(cons_s, func_n2(cons));
reg_fun(intern(lit("make-lazy-cons"), user_package), func_n1(make_lazy_cons));
reg_fun(intern(lit("lcons-fun"), user_package), func_n1(lcons_fun));
- reg_fun(car_s, func_n1(car));
- reg_fun(cdr_s, func_n1(car));
+ reg_fun(car_s, car_f);
+ reg_fun(cdr_s, cdr_f);
reg_fun(intern(lit("rplaca"), user_package), func_n2(rplaca));
reg_fun(intern(lit("rplacd"), user_package), func_n2(rplacd));
reg_fun(intern(lit("first"), user_package), func_n1(car));
reg_fun(intern(lit("rest"), user_package), func_n1(cdr));
reg_fun(append_s, func_n0v(appendv));
reg_fun(list_s, func_n0v(identity));
+ reg_fun(intern(lit("identity"), user_package), identity_f);
reg_fun(intern(lit("atom"), user_package), func_n1(atom));
reg_fun(intern(lit("null"), user_package), func_n1(nullp));
@@ -1086,9 +1089,9 @@ void eval_init(void)
reg_fun(intern(lit("some"), user_package), func_n3(some_satisfy));
reg_fun(intern(lit("all"), user_package), func_n3(all_satisfy));
reg_fun(intern(lit("none"), user_package), func_n3(none_satisfy));
- reg_fun(intern(lit("eq"), user_package), func_n2(eq));
- reg_fun(intern(lit("eql"), user_package), func_n2(eql));
- reg_fun(intern(lit("equal"), user_package), func_n2(equal));
+ reg_fun(intern(lit("eq"), user_package), eq_f);
+ reg_fun(intern(lit("eql"), user_package), eql_f);
+ reg_fun(intern(lit("equal"), user_package), equal_f);
reg_fun(intern(lit("+"), user_package), func_n0v(plusv));
reg_fun(intern(lit("-"), user_package), func_n1v(minusv));