summaryrefslogtreecommitdiff
path: root/pit/src/library.c
diff options
context:
space:
mode:
Diffstat (limited to 'pit/src/library.c')
-rw-r--r--pit/src/library.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/pit/src/library.c b/pit/src/library.c
index b911321..10f56f4 100644
--- a/pit/src/library.c
+++ b/pit/src/library.c
@@ -257,9 +257,7 @@ static pit_value impl_error(pit_runtime *rt, pit_value args, void *data) {
}
static pit_value impl_eval(pit_runtime *rt, pit_value args, void *data) {
(void) data;
- // TODO
- return PIT_NIL;
- // return pit_eval(rt, pit_value_cons_car(rt, args));
+ return pit_vm_eval(rt, pit_compile(rt, pit_value_cons_car(rt, args)));
}
static pit_value impl_eq_p(pit_runtime *rt, pit_value args, void *data) {
(void) data;
@@ -679,6 +677,12 @@ static pit_value impl_div(pit_runtime *rt, pit_value args, void *data) {
}
return pit_value_integer_new(rt, total);
}
+static pit_value impl_mod(pit_runtime *rt, pit_value args, void *data) {
+ (void) data;
+ i64 x = pit_value_as_integer(rt, pit_value_cons_car(rt, args));
+ i64 y = pit_value_as_integer(rt, pit_value_cons_car(rt, pit_value_cons_cdr(rt, args)));
+ return pit_value_integer_new(rt, x % y);
+}
static pit_value impl_not(pit_runtime *rt, pit_value args, void *data) {
(void) data;
if (pit_value_cons_car(rt, args) == PIT_NIL) {
@@ -831,6 +835,7 @@ void pit_install_library_essential(pit_runtime *rt) {
pit_symtab_fset(rt, pit_symtab_intern_cstr(rt, "-"), pit_value_nativefunc_new(rt, impl_sub));
pit_symtab_fset(rt, pit_symtab_intern_cstr(rt, "*"), pit_value_nativefunc_new(rt, impl_mul));
pit_symtab_fset(rt, pit_symtab_intern_cstr(rt, "/"), pit_value_nativefunc_new(rt, impl_div));
+ pit_symtab_fset(rt, pit_symtab_intern_cstr(rt, "%"), pit_value_nativefunc_new(rt, impl_mod));
/* booleans */
pit_symtab_fset(rt, pit_symtab_intern_cstr(rt, "not"), pit_value_nativefunc_new(rt, impl_not));
/* comparisons */