txlyre 6 days ago
parent
commit
9c029e9df8
3 changed files with 287 additions and 158 deletions
  1. 16 15
      qirt.c
  2. 265 143
      qistd.c
  3. 6 0
      std.qi

+ 16 - 15
qirt.c

@@ -2086,24 +2086,22 @@ qi_value_t *qi_index_set(qi_state_t *state, qi_bool is_pf, qi_value_t *value,
   qi_value_t *meta;
   qi_bool fail = false;
 
-  if ((meta = qi_call_meta(state, &fail, value, "__index_set", 3, value, index,
-                           newvalue)))
-    return meta;
-  else if (fail)
-    goto leave;
-  else if (value->type == QI_TABLE && qi_has_metatable(value) &&
-           index->type == QI_STRING) {
-    if (qi_table_has(qi_get_metatable(value), index->value.string)) {
-      qi_value_t *old;
+  if (value->type == QI_TABLE && qi_has_metatable(value) &&
+      index->type == QI_STRING && qi_table_has(qi_get_metatable(value), index->value.string)) {
+    qi_value_t *old;
 
-      if (!is_pf)
-        old = qi_table_get(qi_get_metatable(value), index->value.string);
+    if (!is_pf)
+      old = qi_table_get(qi_get_metatable(value), index->value.string);
 
-      qi_table_set(qi_get_metatable(value), index->value.string, newvalue);
+    qi_table_set(qi_get_metatable(value), index->value.string, newvalue);
 
-      return !is_pf && old ? old : newvalue;
-    }
-  }
+    return !is_pf && old ? old : newvalue;
+  } else if ((meta = qi_call_meta(state, &fail, value, "__index_set", 3, value, index,
+                           newvalue)))
+    return meta;
+
+  if (fail)
+    goto leave;
 
   switch (value->type) {
   case QI_LIST:
@@ -2218,6 +2216,9 @@ qi_value_t *qi_call_debug(qi_state_t *state, qi_value_t *value,
 }
 
 qi_bool _qi_equals(qi_state_t *state, qi_value_t *a, qi_value_t *b) {
+  if (a == b)
+    return true;
+
   qi_value_t *meta;
   if ((meta = qi_call_meta(state, NULL, a, "__equals", 2, a, b))) {
     if (meta->type != QI_BOOLEAN)

File diff suppressed because it is too large
+ 265 - 143
qistd.c


+ 6 - 0
std.qi

@@ -287,6 +287,12 @@ func product(xs)
   return reduce(func (x, y): x * y, xs)
 set_pseudomethod("list.product", product)
 set_pseudomethod("tuple.product", product)
+func all(l): reduce(func (x, y): x && y, l)
+set_pseudomethod("list.all", all)
+set_pseudomethod("tuple.all", all)
+func any(l): reduce(func (x, y): x || y, l)
+set_pseudomethod("list.any", any)
+set_pseudomethod("tuple.any", any)
 func map(f, xs) {
   if type(f) != "function"
     throw "expected first argument to be: function, but got: " + type(f)

Some files were not shown because too many files changed in this diff