| @@ -55,9 +55,18 @@ 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, struct l2_vm_array *args) { | |||
| double sum = 0; | |||
| for (size_t i = 0; i < args->len; ++i) { | |||
| struct l2_vm_value *val = &vm->values[args->data[i]]; | |||
| if (args->len < 1) { | |||
| return 0; | |||
| } | |||
| struct l2_vm_value *val = &vm->values[args->data[0]]; | |||
| if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { | |||
| return l2_vm_type_error(vm, val); | |||
| } | |||
| double sum = val->real; | |||
| for (size_t i = 1; i < args->len; ++i) { | |||
| val = &vm->values[args->data[i]]; | |||
| if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { | |||
| return l2_vm_type_error(vm, val); | |||
| } | |||
| @@ -71,15 +80,78 @@ l2_word l2_builtin_add(struct l2_vm *vm, struct l2_vm_array *args) { | |||
| } | |||
| l2_word l2_builtin_sub(struct l2_vm *vm, struct l2_vm_array *args) { | |||
| return 0; | |||
| if (args->len < 1) { | |||
| return 0; | |||
| } | |||
| struct l2_vm_value *val = &vm->values[args->data[0]]; | |||
| if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { | |||
| return l2_vm_type_error(vm, val); | |||
| } | |||
| double sum = val->real; | |||
| for (size_t i = 1; i < args->len; ++i) { | |||
| val = &vm->values[args->data[i]]; | |||
| if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { | |||
| return l2_vm_type_error(vm, val); | |||
| } | |||
| sum -= val->real; | |||
| } | |||
| l2_word id = l2_vm_alloc(vm, L2_VAL_TYPE_REAL, 0); | |||
| vm->values[id].real = sum; | |||
| return id; | |||
| } | |||
| l2_word l2_builtin_mul(struct l2_vm *vm, struct l2_vm_array *args) { | |||
| return 0; | |||
| if (args->len < 1) { | |||
| return 0; | |||
| } | |||
| struct l2_vm_value *val = &vm->values[args->data[0]]; | |||
| if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { | |||
| return l2_vm_type_error(vm, val); | |||
| } | |||
| double sum = val->real; | |||
| for (size_t i = 1; i < args->len; ++i) { | |||
| val = &vm->values[args->data[i]]; | |||
| if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { | |||
| return l2_vm_type_error(vm, val); | |||
| } | |||
| sum *= val->real; | |||
| } | |||
| l2_word id = l2_vm_alloc(vm, L2_VAL_TYPE_REAL, 0); | |||
| vm->values[id].real = sum; | |||
| return id; | |||
| } | |||
| l2_word l2_builtin_div(struct l2_vm *vm, struct l2_vm_array *args) { | |||
| return 0; | |||
| if (args->len < 1) { | |||
| return 0; | |||
| } | |||
| struct l2_vm_value *val = &vm->values[args->data[0]]; | |||
| if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { | |||
| return l2_vm_type_error(vm, val); | |||
| } | |||
| double sum = val->real; | |||
| for (size_t i = 1; i < args->len; ++i) { | |||
| val = &vm->values[args->data[i]]; | |||
| if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { | |||
| return l2_vm_type_error(vm, val); | |||
| } | |||
| sum /= val->real; | |||
| } | |||
| l2_word id = l2_vm_alloc(vm, L2_VAL_TYPE_REAL, 0); | |||
| vm->values[id].real = sum; | |||
| return id; | |||
| } | |||
| l2_word l2_builtin_print(struct l2_vm *vm, struct l2_vm_array *args) { | |||