|
|
@@ -66,7 +66,9 @@ static void print_val(struct l2_vm *vm, struct l2_io_writer *out, struct l2_vm_v |
|
|
|
|
|
|
|
l2_word l2_builtin_add(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
if (argc < 1) { |
|
|
|
return 0; |
|
|
|
l2_word id = l2_vm_alloc(vm, L2_VAL_TYPE_REAL, 0); |
|
|
|
vm->values[id].real = 0; |
|
|
|
return id; |
|
|
|
} |
|
|
|
|
|
|
|
struct l2_vm_value *val = &vm->values[argv[0]]; |
|
|
@@ -91,7 +93,9 @@ l2_word l2_builtin_add(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
|
|
|
|
l2_word l2_builtin_sub(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
if (argc < 1) { |
|
|
|
return 0; |
|
|
|
l2_word id = l2_vm_alloc(vm, L2_VAL_TYPE_REAL, 0); |
|
|
|
vm->values[id].real = 0; |
|
|
|
return id; |
|
|
|
} |
|
|
|
|
|
|
|
struct l2_vm_value *val = &vm->values[argv[0]]; |
|
|
@@ -116,7 +120,9 @@ l2_word l2_builtin_sub(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
|
|
|
|
l2_word l2_builtin_mul(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
if (argc < 1) { |
|
|
|
return 0; |
|
|
|
l2_word id = l2_vm_alloc(vm, L2_VAL_TYPE_REAL, 0); |
|
|
|
vm->values[id].real = 1; |
|
|
|
return id; |
|
|
|
} |
|
|
|
|
|
|
|
struct l2_vm_value *val = &vm->values[argv[0]]; |
|
|
@@ -141,7 +147,9 @@ l2_word l2_builtin_mul(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
|
|
|
|
l2_word l2_builtin_div(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
if (argc < 1) { |
|
|
|
return 0; |
|
|
|
l2_word id = l2_vm_alloc(vm, L2_VAL_TYPE_REAL, 0); |
|
|
|
vm->values[id].real = 1; |
|
|
|
return id; |
|
|
|
} |
|
|
|
|
|
|
|
struct l2_vm_value *val = &vm->values[argv[0]]; |
|
|
@@ -166,7 +174,7 @@ l2_word l2_builtin_div(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
|
|
|
|
l2_word l2_builtin_eq(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
if (argc < 2) { |
|
|
|
return l2_vm_error(vm, "Expected at least 2 arguments"); |
|
|
|
return vm->ktrue; |
|
|
|
} |
|
|
|
|
|
|
|
for (l2_word i = 1; i < argc; ++i) { |
|
|
@@ -221,7 +229,7 @@ l2_word l2_builtin_neq(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
#define X(name, op) \ |
|
|
|
l2_word name(struct l2_vm *vm, l2_word argc, l2_word *argv) { \ |
|
|
|
if (argc < 2) { \ |
|
|
|
return l2_vm_error(vm, "Expected at least 2 arguments"); \ |
|
|
|
return vm->ktrue; \ |
|
|
|
} \ |
|
|
|
struct l2_vm_value *lhs = &vm->values[argv[0]]; \ |
|
|
|
if (l2_vm_value_type(lhs) != L2_VAL_TYPE_REAL) { \ |