summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-01-14 06:57:43 -0800
committerKaz Kylheku <kaz@kylheku.com>2014-01-14 06:57:43 -0800
commit28bd257494d8a0a6337d6fdd06b820412a2f1c55 (patch)
treea7db5acbae930222af2fad3b6df20461725666d8 /eval.c
parent48c8cec1c83d70e23dc1359b85cfd9e36fdaa60f (diff)
downloadtxr-28bd257494d8a0a6337d6fdd06b820412a2f1c55.tar.gz
txr-28bd257494d8a0a6337d6fdd06b820412a2f1c55.tar.bz2
txr-28bd257494d8a0a6337d6fdd06b820412a2f1c55.zip
* eval.c (bind_args): Implemented default values for optional
arguments. (op_defun): Permit the syntax. * txr.1: Documented.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/eval.c b/eval.c
index f9a68f95..ce610dd1 100644
--- a/eval.c
+++ b/eval.c
@@ -235,8 +235,11 @@ static val bind_args(val env, val params, val args, val ctx_form)
param = car(params);
}
+ if (optargs && consp(param))
+ param = car(param);
+
if (!bindable(param))
- eval_error(ctx_form, lit("~a: ~s is not a bindable sybol"),
+ eval_error(ctx_form, lit("~a: ~s is not a bindable symbol"),
car(ctx_form), param, nao);
new_bindings = acons(param, car(args), new_bindings);
@@ -254,9 +257,16 @@ static val bind_args(val env, val params, val args, val ctx_form)
if (!optargs)
eval_error(ctx_form, lit("~s: too few arguments"), car(ctx_form), nao);
while (consp(params)) {
- if (car(params) == colon_k)
+ val param = car(params);
+ val val = nil;
+ if (param == colon_k)
goto twocol;
- new_bindings = acons(car(params), nil, new_bindings);
+ if (consp(param)) {
+ val = car(cdr(param));
+ param = car(param);
+ }
+ new_bindings = acons(param, eval(val, env, ctx_form),
+ new_bindings);
params = cdr(params);
}
if (bindable(params))
@@ -758,6 +768,8 @@ static val op_defun(val form, val env)
colon = t;
continue;
}
+ if (colon && consp(param))
+ continue;
if (!bindable(param))
eval_error(form, lit("defun: parameter ~s is not a bindable symbol"), param, nao);
}