aboutsummaryrefslogtreecommitdiff
path: root/src/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/builtins.c')
-rw-r--r--src/builtins.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/builtins.c b/src/builtins.c
index f64083b..88bcc9b 100644
--- a/src/builtins.c
+++ b/src/builtins.c
@@ -2,6 +2,33 @@
#include "interp.h"
#include "sexp.h"
+SExpRef builtin_exit(Interp *interp, SExpRef args) {
+ if (LENGTH(args) == 0) {
+ Interp_free(interp);
+ exit(0);
+ }
+ if (LENGTH(args) == 1) {
+ SExpRef x = CAR(args);
+ if (VALTYPE(x) != kIntegerSExp) goto error;
+ int retcode = REF(x)->integer;
+ Interp_free(interp);
+ exit(retcode);
+ }
+error:
+ return new_error(interp, "exit: argument error.\n");
+}
+
+SExpRef builtin_error(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 1) return new_error(interp, "err.\n");
+ if (VALTYPE(CAR(args)) == kStringSExp || VALTYPE(CAR(args)) == kSymbolSExp) {
+ return new_error(interp, "%s\n", REF(CAR(args))->str);
+ }
+ const char *str = lisp_to_string(interp, CAR(args));
+ SExpRef ret = new_error(interp, "%s\n", REF(CAR(args))->str);
+ free((void*)str);
+ return ret;
+}
+
SExpRef builtin_list(Interp *interp, SExpRef args) {
return args;
}