summaryrefslogtreecommitdiff
path: root/pit/src/native.c
diff options
context:
space:
mode:
Diffstat (limited to 'pit/src/native.c')
-rw-r--r--pit/src/native.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/pit/src/native.c b/pit/src/native.c
index 7d61a50..e776f38 100644
--- a/pit/src/native.c
+++ b/pit/src/native.c
@@ -188,6 +188,17 @@ static pit_value impl_diagnostics(pit_runtime *rt, pit_value args, void *data) {
fprintf(stderr, "value allocs: %ld\n", rt->heap->next);
return PIT_NIL;
}
+static pit_value impl_assert(pit_runtime *rt, pit_value args, void *data) {
+ (void) data;
+ pit_value msg = pit_value_cons_car(rt, args); args = pit_value_cons_cdr(rt, args);
+ pit_value expected = pit_value_cons_car(rt, args); args = pit_value_cons_cdr(rt, args);
+ pit_value actual = pit_value_cons_car(rt, args); args = pit_value_cons_cdr(rt, args);
+ if (!pit_value_equal(rt, expected, actual)) {
+ pit_fprintf(rt, stderr, "assertion %v failed!\nexpected: %v\nactual: %v\n", msg, expected, actual);
+ exit(1);
+ }
+ return actual;
+}
static pit_value impl_print(pit_runtime *rt, pit_value args, void *data) {
(void) data;
pit_value x = pit_value_cons_car(rt, args);
@@ -259,6 +270,7 @@ void pit_install_library_io(pit_runtime *rt) {
pit_symtab_set(rt, pit_symtab_intern_cstr(rt, "*load-path*"), load_path);
/* diagnostics */
pit_symtab_fset(rt, pit_symtab_intern_cstr(rt, "diagnostics!"), pit_value_nativefunc_new(rt, impl_diagnostics));
+ pit_symtab_fset(rt, pit_symtab_intern_cstr(rt, "assert!"), pit_value_nativefunc_new(rt, impl_assert));
/* stream IO */
pit_symtab_fset(rt, pit_symtab_intern_cstr(rt, "print!"), pit_value_nativefunc_new(rt, impl_print));
pit_symtab_fset(rt, pit_symtab_intern_cstr(rt, "princ!"), pit_value_nativefunc_new(rt, impl_princ));