diff options
-rw-r--r-- | eval.c | 4 | ||||
-rw-r--r-- | lib.c | 8 | ||||
-rw-r--r-- | lib.h | 1 | ||||
-rw-r--r-- | parser.c | 12 | ||||
-rw-r--r-- | parser.h | 3 | ||||
-rw-r--r-- | txr.c | 5 |
6 files changed, 25 insertions, 8 deletions
@@ -4364,8 +4364,8 @@ void eval_init(void) reg_fun(intern(lit("hash-revget"), user_package), func_n4o(hash_revget, 2)); reg_fun(intern(lit("eval"), user_package), func_n2o(eval_intrinsic, 1)); - reg_fun(intern(lit("lisp-parse"), user_package), func_n4o(lisp_parse, 0)); - reg_fun(intern(lit("read"), user_package), func_n4o(lisp_parse, 0)); + reg_fun(intern(lit("lisp-parse"), user_package), func_n5o(lisp_parse, 0)); + reg_fun(intern(lit("read"), user_package), func_n5o(lisp_parse, 0)); reg_fun(intern(lit("load"), system_package), func_n2(sys_load)); reg_fun(intern(lit("expand"), system_package), func_n2o(expand, 1)); reg_fun(intern(lit("macro-form-p"), user_package), func_n2o(macro_form_p, 1)); @@ -4238,6 +4238,14 @@ val func_n4o(val (*fun)(val, val, val, val), int reqargs) return obj; } +val func_n5o(val (*fun)(val, val, val, val, val), int reqargs) +{ + val obj = func_n5(fun); + obj->f.optargs = 5 - reqargs; + return obj; +} + + val func_n1ov(val (*fun)(val, varg), int reqargs) { val obj = func_n1v(fun); @@ -750,6 +750,7 @@ val func_n1o(val (*fun)(val), int reqargs); val func_n2o(val (*fun)(val, val), int reqargs); val func_n3o(val (*fun)(val, val, val), int reqargs); val func_n4o(val (*fun)(val, val, val, val), int reqargs); +val func_n5o(val (*fun)(val, val, val, val, val), int reqargs); val func_n1ov(val (*fun)(val, varg), int reqargs); val func_n2ov(val (*fun)(val, val, varg), int reqargs); val func_n3ov(val (*fun)(val, val, val, varg), int reqargs); @@ -263,7 +263,8 @@ val regex_parse(val string, val error_stream) return parser.errors ? nil : parser.syntax_tree; } -val lisp_parse(val source_in, val error_stream, val error_return_val, val name_in) +val lisp_parse(val source_in, val error_stream, val error_return_val, + val name_in, val lineno) { uses_or2; val source = default_bool_arg(source_in); @@ -284,6 +285,9 @@ val lisp_parse(val source_in, val error_stream, val error_return_val, val name_i error_stream = if3(error_stream == t, std_output, or2(error_stream, std_null)); class_check (error_stream, stream_s); + if (lineno && !missingp(lineno)) + pi->lineno = c_num(lineno); + env_vbind(dyn_env, stderr_s, error_stream); { @@ -322,7 +326,7 @@ val read_eval_stream(val stream, val error_stream, val hash_bang_support) } for (;;) { - val form = lisp_parse(stream, error_stream, error_val, name); + val form = lisp_parse(stream, error_stream, error_val, name, colon_k); if (form == error_val) { if (parser_errors(get_parser(stream)) == zero) @@ -359,6 +363,7 @@ val repl(val bindings, val in_stream, val out_stream) while (!done) { val prompt = format(nil, lit("~a> "), counter, nao); + val prev_counter = counter; val var_counter = mod(counter, num_fast(100)); char *prompt_u8 = utf8_dup_to(c_str(prompt)); @@ -380,7 +385,8 @@ val repl(val bindings, val in_stream, val out_stream) { val line = string_utf8(line_u8); - val form = lisp_parse(line, out_stream, colon_k, colon_k); + val form = lisp_parse(line, out_stream, colon_k, + lit("line"), prev_counter); val value = eval_intrinsic(form, repl_env); if (value == quit_k) { done = t; @@ -92,7 +92,8 @@ INLINE val rlcp(val to, val from) } val rlcp_tree(val to, val from); val regex_parse(val string, val error_stream); -val lisp_parse(val source, val error_stream, val error_return_val, val name); +val lisp_parse(val source_in, val error_stream, val error_return_val, + val name_in, val lineno); val read_eval_stream(val stream, val error_stream, val hash_bang_support); #if HAVE_TERMIOS val repl(val bindings, val in_stream, val out_stream); @@ -580,7 +580,7 @@ int txr_main(int argc, char **argv) spec_file = arg; break; case 'e': - eval_intrinsic(lisp_parse(arg, std_error, colon_k, colon_k), + eval_intrinsic(lisp_parse(arg, std_error, colon_k, colon_k, colon_k), make_env(bindings, nil, nil)); evaled = t; break; @@ -593,7 +593,8 @@ int txr_main(int argc, char **argv) if3(c_chr(opt) == 'P', pprinl, tprint)); - pf(eval_intrinsic(lisp_parse(arg, std_error, colon_k, colon_k), + pf(eval_intrinsic(lisp_parse(arg, std_error, colon_k, + colon_k, colon_k), make_env(bindings, nil, nil)), std_output); evaled = t; } |