summaryrefslogtreecommitdiffstats
path: root/txr.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-09-10 07:09:01 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-09-10 07:09:01 -0700
commita1fabcdbc8b307ea010da6f831b1a1addbf72ec2 (patch)
tree0316d37f6e43cafed8a21303f270e28c43ef319d /txr.c
parentcbf8c45bc7e737a849b62d4c2283aae11a3010e1 (diff)
downloadtxr-a1fabcdbc8b307ea010da6f831b1a1addbf72ec2.tar.gz
txr-a1fabcdbc8b307ea010da6f831b1a1addbf72ec2.tar.bz2
txr-a1fabcdbc8b307ea010da6f831b1a1addbf72ec2.zip
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.
Diffstat (limited to 'txr.c')
-rw-r--r--txr.c9
1 files changed, 7 insertions, 2 deletions
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)