Add detailed error reporting, remove panics
diff --git a/src/lisp/lib/std.c b/src/lisp/lib/std.c
index 85221ea..5ad02bc 100644
--- a/src/lisp/lib/std.c
+++ b/src/lisp/lib/std.c
@@ -89,6 +89,7 @@
value_t l_read_stdin()
{
+#ifndef NO_READLINE
char *string = read_input_line("lisp> ");
if (!string)
return nil;
@@ -96,12 +97,25 @@
struct istream *is = new_stristream_nt(string);
value_t val = nil;
- read1(is, &val);
+ struct error err;
+
+ if (!IS_OKAY((err = read1(is, &val))))
+ {
+ ereport(err);
+
+ del_stristream(is);
+ free(string);
+ // tail recursion, yay!
+ return l_read_stdin();
+ }
del_stristream(is);
free(string);
return val;
+#else
+ return nil;
+#endif
}
value_t l_num_eq(value_t a, value_t b)
@@ -114,8 +128,10 @@
return (a >> 3) == (b >> 3) ? t : nil;
}
-void load_std(struct environment *env)
+struct error load_std(struct environment *env)
{
+ E_INIT();
+
add_c_function(env, "+", l_plus, 2);
add_c_function(env, "-", l_minus, 2);
add_c_function(env, "*", l_times, 2);
@@ -135,8 +151,10 @@
if (!load_library(env, "std"))
{
- err("Could not load library `std`, make sure your $LISP_LIBRARY_PATH is correct.");
+ THROW(ENOTFOUND, "Could not load library `std`, make sure your $LISP_LIBRARY_PATH is correct.");
}
+
+ OKAY();
}
bool load_library(struct environment *env, char *name)
diff --git a/src/lisp/lib/std.h b/src/lisp/lib/std.h
index dae0ac3..eb129d5 100644
--- a/src/lisp/lib/std.h
+++ b/src/lisp/lib/std.h
@@ -8,5 +8,5 @@
void add_function(struct environment *env, char *name, void *func, struct args *args, enum namespace ns);
void add_c_function(struct environment *env, char *name, void *func, int nargs);
-void load_std(struct environment *env);
+struct error load_std(struct environment *env) WARN_UNUSED;
bool load_library(struct environment *env, char *name);