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);