if function.

main
bog 2024-03-30 20:15:21 +01:00
parent b8fa1df563
commit d5f95da105
5 changed files with 39 additions and 2 deletions

12
features/cond.mk Normal file
View File

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

View File

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

View File

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

View File

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

View File

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