From a1fabcdbc8b307ea010da6f831b1a1addbf72ec2 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 10 Sep 2015 07:09:01 -0700 Subject: Bugfix: *args* not bound for command line expressions. The documentation says that *args* is bound to nil, but actually it is not bound at all. Let us fix this by actualy binding *args* to the remaining arguments, and by also allowing modification of *args* to dynamically take effect. * txr.c: Set up value of *args* prior to processing any option which evaluates TXR Lisp. Afterwards, reload the argument list from that variable. * txr.1: Documented semantics of *args* during command line processing. --- txr.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'txr.c') diff --git a/txr.c b/txr.c index af8f4bbe..cbd2ff8f 100644 --- a/txr.c +++ b/txr.c @@ -398,6 +398,7 @@ int txr_main(int argc, char **argv) val parse_stream = std_input; val txr_lisp_p = nil; val enter_repl = nil; + val args_s = intern(lit("*args*"), user_package); val self_path_s = intern(lit("self-path"), user_package); list_collect_decl(arg_list, arg_tail); @@ -553,7 +554,6 @@ int txr_main(int argc, char **argv) } } - /* Single letter options with args: non-clumping. */ if (length(arg) == two && find(ref(arg, one), lit("acfepPtC"), nil, nil)) { @@ -583,10 +583,13 @@ int txr_main(int argc, char **argv) break; case 'e': reg_varl(self_path_s, lit("cmdline-expr")); + reg_var(args_s, arg_list); + eval_intrinsic(lisp_parse(arg, std_error, colon_k, lit("cmdline-expr"), colon_k), make_env(bindings, nil, nil)); evaled = t; + arg_list = cdr(lookup_global_var(args_s)); break; case 'p': case 'P': @@ -598,10 +601,12 @@ int txr_main(int argc, char **argv) pprinl, tprint)); reg_varl(self_path_s, lit("cmdline-expr")); + reg_var(args_s, arg_list); pf(eval_intrinsic(lisp_parse(arg, std_error, colon_k, lit("cmdline-expr"), colon_k), make_env(bindings, nil, nil)), std_output); evaled = t; + arg_list = cdr(lookup_global_var(args_s)); } break; } @@ -718,7 +723,7 @@ int txr_main(int argc, char **argv) } } - reg_var(intern(lit("*args*"), user_package), arg_list); + reg_var(args_s, arg_list); reg_varl(intern(lit("self-path"), user_package), spec_file_str); if (!txr_lisp_p) -- cgit v1.2.3