diff --git a/lib.c b/lib.c index a441b0e..e439b5a 100644 --- a/lib.c +++ b/lib.c @@ -1757,6 +1757,41 @@ static void get_size_array(struct context* ctx) { ink_push(ctx, sz); } +static void is_array(struct context* ctx) { + int tid; + struct ink_routine *currentRoutine; + struct elem a; + + tid = get_type_by_name(ctx, "array"); + currentRoutine = ctx->routines + ctx->routine_current; + if (currentRoutine->top < 1) { + currentRoutine->panic = -1; + return; + } + a.type = INK_INTEGER; + a.value = currentRoutine->stack[currentRoutine->top - 1].type == tid; + ink_pop(ctx); + + ink_push(ctx, a); +} + +static void is_int(struct context* ctx) { + int tid; + struct ink_routine *currentRoutine; + struct elem a; + + currentRoutine = ctx->routines + ctx->routine_current; + if (currentRoutine->top < 1) { + currentRoutine->panic = -1; + return; + } + a.type = INK_INTEGER; + a.value = currentRoutine->stack[currentRoutine->top - 1].type == INK_INTEGER; + ink_pop(ctx); + + ink_push(ctx, a); +} + static void print_array_of_codepoints(struct context* ctx) { int tid, i; struct ink_routine *currentRoutine; @@ -1834,6 +1869,7 @@ int ink_std_library(struct context* ctx) { v += ink_add_native(ctx, "pluck", pluck_elem); v += ink_add_native(ctx, "return_if", return_if); v += ink_add_native(ctx, "jump_if", jump_if); + v += ink_add_native(ctx, "is.int", is_int); #ifndef NOEXTRAARITHMETIC v += ink_add_native(ctx, ">", gt_int); v += ink_add_native(ctx, ">=", gte_int); @@ -1851,6 +1887,7 @@ int ink_std_library(struct context* ctx) { v += ink_add_native(ctx, "array.set", set_array); v += ink_add_native(ctx, "array.size", get_size_array); v += ink_add_native(ctx, "array.print_utf8", print_array_of_codepoints); + v += ink_add_native(ctx, "is.array", is_array); v += ink_add_native(ctx, "stack.to_array", arrayify_stack); #endif // NOARRAYLIB