diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-01-14 06:57:43 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-01-14 06:57:43 -0800 |
commit | 28bd257494d8a0a6337d6fdd06b820412a2f1c55 (patch) | |
tree | a7db5acbae930222af2fad3b6df20461725666d8 /eval.c | |
parent | 48c8cec1c83d70e23dc1359b85cfd9e36fdaa60f (diff) | |
download | txr-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.c | 18 |
1 files changed, 15 insertions, 3 deletions
@@ -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); } |