✨ if function.
parent
b8fa1df563
commit
d5f95da105
|
@ -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))
|
|
@ -14,6 +14,7 @@ void register_builtins(struct moka* moka)
|
||||||
|
|
||||||
moka_decl_native(moka, "do", mk_do, -1);
|
moka_decl_native(moka, "do", mk_do, -1);
|
||||||
moka_decl_native(moka, "set!", mk_set_mut, 2);
|
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_lt, 2);
|
||||||
moka_decl_native(moka, "<=", mk_le, 2);
|
moka_decl_native(moka, "<=", mk_le, 2);
|
||||||
|
@ -153,6 +154,26 @@ MOKA mk_set_mut(struct moka* moka, struct vec* args)
|
||||||
return value;
|
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
|
// Comparisons
|
||||||
// ===========
|
// ===========
|
||||||
MOKA mk_lt(struct moka* moka, struct vec* args)
|
MOKA mk_lt(struct moka* moka, struct vec* args)
|
||||||
|
|
|
@ -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_do(struct moka* moka, struct vec* args);
|
||||||
MOKA mk_set_mut(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
|
// Comparisons
|
||||||
// ===========
|
// ===========
|
||||||
MOKA mk_lt(struct moka* moka, struct vec* args);
|
MOKA mk_lt(struct moka* moka, struct vec* args);
|
||||||
|
|
|
@ -757,7 +757,7 @@ MOKA moka_push_bool(struct moka* self, bool value, int line)
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
float moka_get_bool(struct moka* self, MOKA value)
|
bool moka_get_bool(struct moka* self, MOKA value)
|
||||||
{
|
{
|
||||||
assert(self);
|
assert(self);
|
||||||
struct frame* frame = moka_frame(self);
|
struct frame* frame = moka_frame(self);
|
||||||
|
|
|
@ -91,7 +91,7 @@ MOKA moka_push_float(struct moka* self, float value, int line);
|
||||||
float moka_get_float(struct moka* self, MOKA value);
|
float moka_get_float(struct moka* self, MOKA value);
|
||||||
|
|
||||||
MOKA moka_push_bool(struct moka* self, bool value, int line);
|
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);
|
MOKA moka_push_string(struct moka* self, char const* value, int line);
|
||||||
char* moka_get_string(struct moka* self, MOKA value);
|
char* moka_get_string(struct moka* self, MOKA value);
|
||||||
|
|
Loading…
Reference in New Issue