diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-09-05 10:48:40 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-09-05 10:48:40 -0700 |
commit | 59681c49080f395057548e0d848fbde40d3f0c34 (patch) | |
tree | e351e066afc6db98fc74ba13ec603b12dc1105d4 | |
parent | 198565656bc40629454a45d019c935c7fa24b76a (diff) | |
download | txr-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.
-rw-r--r-- | parser.c | 16 |
1 files changed, 15 insertions, 1 deletions
@@ -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); } } |