#ifndef MK_MOKA_H #define MK_MOKA_H #include "commons.h" #include "vec.h" #include "value.h" #include "symtable.h" struct frame { struct vec stack; struct vec local_values; }; struct moka { struct status* status; struct symtable symtable; struct vec frame_stack; struct vec global_values; }; void moka_init(struct moka* self, struct status* status); void frame_init(struct frame* self); void frame_free(struct frame* self); void moka_free(struct moka* self); void moka_decl_native(struct moka* self, char* name, native_fun_t fun); struct frame* moka_frame(struct moka* self); bool moka_has_top(struct moka* self); MOKA moka_top(struct moka* self); MOKA moka_pop(struct moka* self); bool moka_is(struct moka* self, MOKA value, TypeKind type); TypeKind moka_type_of(struct moka* self, MOKA value); void moka_dump(struct moka* self, MOKA value); MOKA moka_call(struct moka* self, int arg_count); MOKA moka_push_int(struct moka* self, int value, int line); int moka_get_int(struct moka* self, MOKA value); 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); MOKA moka_push_string(struct moka* self, char const* value, int line); char* moka_get_string(struct moka* self, MOKA value); MOKA moka_push_symbol(struct moka* self, char const* value, int line); char* moka_get_symbol(struct moka* self, MOKA value); MOKA moka_push_ref(struct moka* self, size_t value, int line); size_t moka_get_ref(struct moka* self, MOKA value); MOKA moka_push_native(struct moka* self, native_fun_t value, int line); native_fun_t moka_get_native(struct moka* self, MOKA value); MOKA moka_eval_lazy(struct moka* self, MOKA lazy_value); MOKA moka_push_lazy(struct moka* self, struct node* value, int line); struct node* moka_get_lazy(struct moka* self, MOKA value); #endif