summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-09-05 11:09:07 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-09-05 11:09:07 -0700
commit5fb2d4a21816d2d06ec0b12ff7be5b09a7771ce4 (patch)
tree46dad3990fcbbf1935c531f4a526ecc63d141825
parent59681c49080f395057548e0d848fbde40d3f0c34 (diff)
downloadtxr-5fb2d4a21816d2d06ec0b12ff7be5b09a7771ce4.tar.gz
txr-5fb2d4a21816d2d06ec0b12ff7be5b09a7771ce4.tar.bz2
txr-5fb2d4a21816d2d06ec0b12ff7be5b09a7771ce4.zip
Syntax errors refer to REPL line number.
* eval.c (eval_init): Registrations of lisp-parse and read must account for new optional argument. * lib.c (func_n5o): New function. * lib.h (func_n5o): Declared. * parser.c (lisp_parse): New argument for passing in line number. This is punched into the parser object. (read_eval_stream): Call to lisp_parse defaults new argument. (repl): Pass repl line number to lisp_parse. * parser.h (lisp_parse): Declaration updated. * txr.c (txr_main): Call to lisp_parse defaults new argument.
-rw-r--r--eval.c4
-rw-r--r--lib.c8
-rw-r--r--lib.h1
-rw-r--r--parser.c12
-rw-r--r--parser.h3
-rw-r--r--txr.c5
6 files changed, 25 insertions, 8 deletions
diff --git a/eval.c b/eval.c
index 98a7fbec..1e5919cf 100644
--- a/eval.c
+++ b/eval.c
@@ -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));
diff --git a/lib.c b/lib.c
index adc73095..597a5f81 100644
--- a/lib.c
+++ b/lib.c
@@ -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);
diff --git a/lib.h b/lib.h
index 38505cac..a7b4187b 100644
--- a/lib.h
+++ b/lib.h
@@ -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);
diff --git a/parser.c b/parser.c
index 6344b82a..a0bec2dd 100644
--- a/parser.c
+++ b/parser.c
@@ -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;
diff --git a/parser.h b/parser.h
index 16308570..bc6a3364 100644
--- a/parser.h
+++ b/parser.h
@@ -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);
diff --git a/txr.c b/txr.c
index 5786c044..67069e1a 100644
--- a/txr.c
+++ b/txr.c
@@ -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;
}