@@ -1,5 +1,11 @@ | |||
// X macro: Define a macro named X, then include this file, then undef X. | |||
#ifdef Y | |||
Y("none", knone) | |||
Y("true", ktrue) | |||
Y("false", kfalse) | |||
#endif | |||
#ifdef X | |||
X("+", l2_builtin_add) | |||
X("-", l2_builtin_sub) |
@@ -113,6 +113,8 @@ struct l2_vm { | |||
struct l2_vm_stack_frame fstack[1024]; | |||
l2_word fsptr; | |||
l2_word knone, ktrue, kfalse; | |||
}; | |||
void l2_vm_init(struct l2_vm *vm, l2_word *ops, size_t opcount); |
@@ -15,9 +15,12 @@ void l2_gen_init(struct l2_generator *gen, struct l2_io_writer *w) { | |||
l2_bufio_writer_init(&gen->writer, w); | |||
// Register atoms for all builtins | |||
#define Y(name, k) \ | |||
l2_strset_put_copy(&gen->atomset, name); | |||
#define X(name, f) \ | |||
l2_strset_put_copy(&gen->atomset, name); | |||
#include "builtins.x.h" | |||
#undef Y | |||
#undef X | |||
} | |||
@@ -9,7 +9,13 @@ static void print_val(struct l2_vm *vm, struct l2_io_writer *out, struct l2_vm_v | |||
break; | |||
case L2_VAL_TYPE_ATOM: | |||
l2_io_printf(out, "(atom %u)", val->atom); | |||
if (val->atom == vm->values[vm->ktrue].atom) { | |||
l2_io_printf(out, "(true)"); | |||
} else if (val->atom == vm->values[vm->kfalse].atom) { | |||
l2_io_printf(out, "(false)"); | |||
} else { | |||
l2_io_printf(out, "(atom %u)", val->atom); | |||
} | |||
break; | |||
case L2_VAL_TYPE_REAL: |
@@ -192,9 +192,19 @@ void l2_vm_init(struct l2_vm *vm, l2_word *ops, size_t opcount) { | |||
// Define a C function variable for every builtin | |||
l2_word id; | |||
l2_word key = 1; | |||
#define Y(name, k) \ | |||
if (strcmp(#k, "knone") == 0) { \ | |||
id = 0; \ | |||
} else { \ | |||
id = alloc_val(vm); \ | |||
vm->values[id].flags = L2_VAL_TYPE_ATOM | L2_VAL_CONST; \ | |||
vm->values[id].atom = key; \ | |||
} \ | |||
vm->k = id; \ | |||
l2_vm_namespace_set(&vm->values[builtins], key++, id); | |||
#define X(name, f) \ | |||
id = alloc_val(vm); \ | |||
vm->values[id].flags = L2_VAL_TYPE_CFUNCTION; \ | |||
vm->values[id].flags = L2_VAL_TYPE_CFUNCTION | L2_VAL_CONST; \ | |||
vm->values[id].cfunc = f; \ | |||
l2_vm_namespace_set(&vm->values[builtins], key++, id); | |||
#include "builtins.x.h" |