|
|
@@ -54,19 +54,19 @@ 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) { |
|
|
|
if (args->len < 1) { |
|
|
|
l2_word l2_builtin_add(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
if (argc < 1) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
struct l2_vm_value *val = &vm->values[args->data[0]]; |
|
|
|
struct l2_vm_value *val = &vm->values[argv[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]]; |
|
|
|
for (l2_word i = 1; i < argc; ++i) { |
|
|
|
val = &vm->values[argv[i]]; |
|
|
|
if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { |
|
|
|
return l2_vm_type_error(vm, val); |
|
|
|
} |
|
|
@@ -79,19 +79,19 @@ l2_word l2_builtin_add(struct l2_vm *vm, struct l2_vm_array *args) { |
|
|
|
return id; |
|
|
|
} |
|
|
|
|
|
|
|
l2_word l2_builtin_sub(struct l2_vm *vm, struct l2_vm_array *args) { |
|
|
|
if (args->len < 1) { |
|
|
|
l2_word l2_builtin_sub(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
if (argc < 1) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
struct l2_vm_value *val = &vm->values[args->data[0]]; |
|
|
|
struct l2_vm_value *val = &vm->values[argv[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]]; |
|
|
|
for (l2_word i = 1; i < argc; ++i) { |
|
|
|
val = &vm->values[argv[i]]; |
|
|
|
if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { |
|
|
|
return l2_vm_type_error(vm, val); |
|
|
|
} |
|
|
@@ -104,19 +104,19 @@ l2_word l2_builtin_sub(struct l2_vm *vm, struct l2_vm_array *args) { |
|
|
|
return id; |
|
|
|
} |
|
|
|
|
|
|
|
l2_word l2_builtin_mul(struct l2_vm *vm, struct l2_vm_array *args) { |
|
|
|
if (args->len < 1) { |
|
|
|
l2_word l2_builtin_mul(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
if (argc < 1) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
struct l2_vm_value *val = &vm->values[args->data[0]]; |
|
|
|
struct l2_vm_value *val = &vm->values[argv[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]]; |
|
|
|
for (l2_word i = 1; i < argc; ++i) { |
|
|
|
val = &vm->values[argv[i]]; |
|
|
|
if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { |
|
|
|
return l2_vm_type_error(vm, val); |
|
|
|
} |
|
|
@@ -129,19 +129,19 @@ l2_word l2_builtin_mul(struct l2_vm *vm, struct l2_vm_array *args) { |
|
|
|
return id; |
|
|
|
} |
|
|
|
|
|
|
|
l2_word l2_builtin_div(struct l2_vm *vm, struct l2_vm_array *args) { |
|
|
|
if (args->len < 1) { |
|
|
|
l2_word l2_builtin_div(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
if (argc < 1) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
struct l2_vm_value *val = &vm->values[args->data[0]]; |
|
|
|
struct l2_vm_value *val = &vm->values[argv[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]]; |
|
|
|
for (l2_word i = 1; i < argc; ++i) { |
|
|
|
val = &vm->values[argv[i]]; |
|
|
|
if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) { |
|
|
|
return l2_vm_type_error(vm, val); |
|
|
|
} |
|
|
@@ -154,13 +154,13 @@ l2_word l2_builtin_div(struct l2_vm *vm, struct l2_vm_array *args) { |
|
|
|
return id; |
|
|
|
} |
|
|
|
|
|
|
|
l2_word l2_builtin_print(struct l2_vm *vm, struct l2_vm_array *args) { |
|
|
|
for (size_t i = 0; i < args->len; ++i) { |
|
|
|
l2_word l2_builtin_print(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
for (size_t i = 0; i < argc; ++i) { |
|
|
|
if (i != 0) { |
|
|
|
vm->std_output->write(vm->std_output, " ", 1); |
|
|
|
} |
|
|
|
|
|
|
|
struct l2_vm_value *val = &vm->values[args->data[i]]; |
|
|
|
struct l2_vm_value *val = &vm->values[argv[i]]; |
|
|
|
print_val(vm, vm->std_output, val); |
|
|
|
} |
|
|
|
|
|
|
@@ -168,13 +168,16 @@ l2_word l2_builtin_print(struct l2_vm *vm, struct l2_vm_array *args) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
l2_word l2_builtin_len(struct l2_vm *vm, struct l2_vm_array *args) { |
|
|
|
// TODO: error if wrong argc |
|
|
|
l2_word l2_builtin_len(struct l2_vm *vm, l2_word argc, l2_word *argv) { |
|
|
|
if (argc < 1) { |
|
|
|
return l2_vm_error(vm, "Expected at least 1 argument"); |
|
|
|
} |
|
|
|
|
|
|
|
l2_word ret_id = l2_vm_alloc(vm, L2_VAL_TYPE_REAL, 0); |
|
|
|
struct l2_vm_value *ret = &vm->values[ret_id]; |
|
|
|
ret->real = 0; |
|
|
|
|
|
|
|
struct l2_vm_value *val = &vm->values[args->data[0]]; |
|
|
|
struct l2_vm_value *val = &vm->values[argv[0]]; |
|
|
|
switch (l2_vm_value_type(val)) { |
|
|
|
case L2_VAL_TYPE_NONE: |
|
|
|
case L2_VAL_TYPE_ATOM: |