Преглед на файлове

implement the basic operators

master
Martin Dørum преди 3 години
родител
ревизия
554b5a9032
променени са 1 файла, в които са добавени 78 реда и са изтрити 6 реда
  1. 78
    6
      lib/vm/builtins.c

+ 78
- 6
lib/vm/builtins.c Целия файл

@@ -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…
Отказ
Запис