diff --git a/features/cond.mk b/features/cond.mk new file mode 100644 index 0000000..bb7b0b0 --- /dev/null +++ b/features/cond.mk @@ -0,0 +1,12 @@ +(assert-eqv! 4 (if true 4 6)) +(assert-eqv! 29 (if false 7 29)) + +(assert-eqv! 7 (if + true + 7 + (assert-eqv! 0 1))) + +(assert-eqv! 4 (if + false + (assert-eqv! 0 1) + 4)) diff --git a/lib/builtins.c b/lib/builtins.c index 4743fde..dba3507 100644 --- a/lib/builtins.c +++ b/lib/builtins.c @@ -14,6 +14,7 @@ void register_builtins(struct moka* moka) moka_decl_native(moka, "do", mk_do, -1); moka_decl_native(moka, "set!", mk_set_mut, 2); + moka_decl_native(moka, "if", mk_if, 3); moka_decl_native(moka, "<", mk_lt, 2); moka_decl_native(moka, "<=", mk_le, 2); @@ -153,6 +154,26 @@ MOKA mk_set_mut(struct moka* moka, struct vec* args) return value; } +MOKA mk_if(struct moka* moka, struct vec* args) +{ + assert(moka); + assert(args); + + MOKA cond = MK_EVAL((MOKA) args->data[0]); + MOKA res = 0; + + if (moka_get_bool(moka, cond)) + { + res = MK_EVAL((MOKA) args->data[1]); + } + else + { + res = MK_EVAL((MOKA) args->data[2]); + } + + return moka_push(moka, res); +} + // Comparisons // =========== MOKA mk_lt(struct moka* moka, struct vec* args) diff --git a/lib/builtins.h b/lib/builtins.h index 2b00e4e..a87e480 100644 --- a/lib/builtins.h +++ b/lib/builtins.h @@ -16,6 +16,10 @@ MOKA mk_assert_eqv_mut(struct moka* moka, struct vec* args); MOKA mk_do(struct moka* moka, struct vec* args); MOKA mk_set_mut(struct moka* moka, struct vec* args); +// Flow Control +// ============ +MOKA mk_if(struct moka* moka, struct vec* args); + // Comparisons // =========== MOKA mk_lt(struct moka* moka, struct vec* args); diff --git a/lib/moka.c b/lib/moka.c index f3f42f8..83df866 100644 --- a/lib/moka.c +++ b/lib/moka.c @@ -757,7 +757,7 @@ MOKA moka_push_bool(struct moka* self, bool value, int line) return addr; } -float moka_get_bool(struct moka* self, MOKA value) +bool moka_get_bool(struct moka* self, MOKA value) { assert(self); struct frame* frame = moka_frame(self); diff --git a/lib/moka.h b/lib/moka.h index 6f3749e..47212fa 100644 --- a/lib/moka.h +++ b/lib/moka.h @@ -91,7 +91,7 @@ MOKA moka_push_float(struct moka* self, float value, int line); float moka_get_float(struct moka* self, MOKA value); MOKA moka_push_bool(struct moka* self, bool value, int line); -float moka_get_bool(struct moka* self, MOKA value); +bool moka_get_bool(struct moka* self, MOKA value); MOKA moka_push_string(struct moka* self, char const* value, int line); char* moka_get_string(struct moka* self, MOKA value);