summaryrefslogtreecommitdiffstats
path: root/parser.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-09-05 10:48:40 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-09-05 10:48:40 -0700
commit59681c49080f395057548e0d848fbde40d3f0c34 (patch)
treee351e066afc6db98fc74ba13ec603b12dc1105d4 /parser.c
parent198565656bc40629454a45d019c935c7fa24b76a (diff)
downloadtxr-59681c49080f395057548e0d848fbde40d3f0c34.tar.gz
txr-59681c49080f395057548e0d848fbde40d3f0c34.tar.bz2
txr-59681c49080f395057548e0d848fbde40d3f0c34.zip
Numbered prompt with backreferencing.
* parser.c (repl): Implement counter which enumerates REPL lines. Implement *<num> variabls which allow the last 100 results to be referenced, as well as *n, *v, and *r variables to have more flexible access to this value history.
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/parser.c b/parser.c
index 00b3ab2e..6344b82a 100644
--- a/parser.c
+++ b/parser.c
@@ -347,14 +347,23 @@ val repl(val bindings, val in_stream, val out_stream)
char *prompt_u8 = 0;
val repl_env = make_env(bindings, nil, nil);
val quit_k = intern(lit("quit"), keyword_package);
+ val counter_sym = intern(lit("*n"), user_package);
+ val var_counter_sym = intern(lit("*v"), user_package);
+ val result_hash_sym = intern(lit("*r"), user_package);
val catch_all = list(t, nao);
+ val result_hash = make_hash(nil, nil, nil);
val done = nil;
val counter = one;
+ reg_varl(result_hash_sym, result_hash);
+
while (!done) {
val prompt = format(nil, lit("~a> "), counter, nao);
+ val var_counter = mod(counter, num_fast(100));
char *prompt_u8 = utf8_dup_to(c_str(prompt));
+ reg_varl(counter_sym, counter);
+ reg_varl(var_counter_sym, var_counter);
line_u8 = linenoise(ls, prompt_u8);
free (prompt_u8);
prompt_u8 = 0;
@@ -376,8 +385,13 @@ val repl(val bindings, val in_stream, val out_stream)
if (value == quit_k) {
done = t;
} else {
+ val var_name = format(nil, lit("*~a"), var_counter, nao);
+ val sym = intern(var_name, user_package);
+
+ reg_varl(sym, value);
+ sethash(result_hash, var_counter, value);
prinl(value, out_stream);
- lino_hist_add(ls, line_u8); /* Add to the history. */
+ lino_hist_add(ls, line_u8);
}
}