Browse Source

implement the basic operators

master
Martin Dørum 3 years ago
parent
commit
554b5a9032
1 changed files with 78 additions and 6 deletions
  1. 78
    6
      lib/vm/builtins.c

+ 78
- 6
lib/vm/builtins.c View File

@@ -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) {

Loading…
Cancel
Save