You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

builtins.c 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "vm/builtins.h"
  2. #include <stdio.h>
  3. static void print_val(struct l2_vm *vm, struct l2_vm_value *val) {
  4. switch (l2_vm_value_type(val)) {
  5. case L2_VAL_TYPE_NONE:
  6. printf("(none)");
  7. break;
  8. case L2_VAL_TYPE_ATOM:
  9. printf("(atom %u)", val->atom);
  10. break;
  11. case L2_VAL_TYPE_REAL:
  12. printf("%g", val->real);
  13. break;
  14. case L2_VAL_TYPE_BUFFER:
  15. fwrite(val->buffer->data, 1, val->buffer->len, stdout);
  16. break;
  17. case L2_VAL_TYPE_ARRAY:
  18. putchar('[');
  19. for (size_t i = 0; i < val->array->len; ++i) {
  20. if (i != 0) {
  21. printf(", ");
  22. }
  23. print_val(vm, &vm->values[val->array->data[i]]);
  24. }
  25. putchar(']');
  26. break;
  27. case L2_VAL_TYPE_NAMESPACE:
  28. printf("(namespace)");
  29. break;
  30. case L2_VAL_TYPE_FUNCTION:
  31. case L2_VAL_TYPE_CFUNCTION:
  32. printf("(function)");
  33. break;
  34. }
  35. }
  36. l2_word l2_builtin_add(struct l2_vm *vm, struct l2_vm_array *args) {
  37. double sum = 0;
  38. for (size_t i = 0; i < args->len; ++i) {
  39. struct l2_vm_value *val = &vm->values[args->data[i]];
  40. if (l2_vm_value_type(val) != L2_VAL_TYPE_REAL) {
  41. // TODO: Error
  42. }
  43. sum += val->real;
  44. }
  45. l2_word id = l2_vm_alloc(vm, L2_VAL_TYPE_REAL, 0);
  46. vm->values[id].real = sum;
  47. return id;
  48. }
  49. l2_word l2_builtin_sub(struct l2_vm *vm, struct l2_vm_array *args) {
  50. return 0;
  51. }
  52. l2_word l2_builtin_mul(struct l2_vm *vm, struct l2_vm_array *args) {
  53. return 0;
  54. }
  55. l2_word l2_builtin_div(struct l2_vm *vm, struct l2_vm_array *args) {
  56. return 0;
  57. }
  58. l2_word l2_builtin_print(struct l2_vm *vm, struct l2_vm_array *args) {
  59. for (size_t i = 0; i < args->len; ++i) {
  60. if (i != 0) {
  61. putchar(' ');
  62. }
  63. struct l2_vm_value *val = &vm->values[args->data[i]];
  64. print_val(vm, val);
  65. }
  66. putchar('\n');
  67. return 0;
  68. }
  69. l2_word l2_builtin_len(struct l2_vm *vm, struct l2_vm_array *args) {
  70. // TODO: error if wrong argc
  71. l2_word ret_id = l2_vm_alloc(vm, L2_VAL_TYPE_REAL, 0);
  72. struct l2_vm_value *ret = &vm->values[ret_id];
  73. ret->real = 0;
  74. struct l2_vm_value *val = &vm->values[args->data[0]];
  75. switch (l2_vm_value_type(val)) {
  76. case L2_VAL_TYPE_NONE:
  77. case L2_VAL_TYPE_ATOM:
  78. case L2_VAL_TYPE_REAL:
  79. case L2_VAL_TYPE_FUNCTION:
  80. case L2_VAL_TYPE_CFUNCTION:
  81. break;
  82. case L2_VAL_TYPE_BUFFER:
  83. if (val->buffer) {
  84. ret->real = val->buffer->len;
  85. }
  86. break;
  87. case L2_VAL_TYPE_ARRAY:
  88. if (val->array) {
  89. ret->real = val->array->len;
  90. }
  91. break;
  92. case L2_VAL_TYPE_NAMESPACE:
  93. if (val->ns) {
  94. ret->real = val->ns->len;
  95. }
  96. }
  97. return ret_id;
  98. }