| l2_word l2_builtin_add(struct l2_vm *vm, l2_word argc, l2_word *argv) { | l2_word l2_builtin_add(struct l2_vm *vm, l2_word argc, l2_word *argv) { | ||||
| if (argc < 1) { | 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]]; | struct l2_vm_value *val = &vm->values[argv[0]]; | ||||
| l2_word l2_builtin_sub(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) { | 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]]; | struct l2_vm_value *val = &vm->values[argv[0]]; | ||||
| l2_word l2_builtin_mul(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) { | 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]]; | struct l2_vm_value *val = &vm->values[argv[0]]; | ||||
| l2_word l2_builtin_div(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) { | 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]]; | struct l2_vm_value *val = &vm->values[argv[0]]; | ||||
| l2_word l2_builtin_eq(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) { | if (argc < 2) { | ||||
| return l2_vm_error(vm, "Expected at least 2 arguments"); | |||||
| return vm->ktrue; | |||||
| } | } | ||||
| for (l2_word i = 1; i < argc; ++i) { | for (l2_word i = 1; i < argc; ++i) { | ||||
| #define X(name, op) \ | #define X(name, op) \ | ||||
| l2_word name(struct l2_vm *vm, l2_word argc, l2_word *argv) { \ | l2_word name(struct l2_vm *vm, l2_word argc, l2_word *argv) { \ | ||||
| if (argc < 2) { \ | 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]]; \ | struct l2_vm_value *lhs = &vm->values[argv[0]]; \ | ||||
| if (l2_vm_value_type(lhs) != L2_VAL_TYPE_REAL) { \ | if (l2_vm_value_type(lhs) != L2_VAL_TYPE_REAL) { \ |