txlyre 3 weeks ago
parent
commit
87b2718624
2 changed files with 23 additions and 17 deletions
  1. 17 11
      qirt.c
  2. 6 6
      qirt.h

+ 17 - 11
qirt.c

@@ -831,7 +831,7 @@ qi_value_t *qi_make_file(qi_state_t *state, FILE *file, char *mode) {
 qi_value_t *qi_make_list(qi_state_t *state, qi_list_t *list) {
   qi_value_t *value = qi_make_value(QI_LIST);
   value->lock = qi_lock_create();
-  value->value.list = list;
+  value->value.list = !list? qi_list_make(): list;
 
   GC_register_finalizer(value, qi_value_finalizer, (void *)state, NULL, NULL);
 
@@ -1449,7 +1449,13 @@ qi_value_t *qi_find(qi_state_t *state, char *name) {
 
 qi_value_t *qi_get(qi_state_t *state, char *name) {
   qi_value_t *value;
-  if (strcmp(name, "STDIN") == 0)
+  if (strcmp(name, "nil") == 0)
+    return state->nil;
+  else if (strcmp(name, "true") == 0)
+    return state->_true;
+  else if (strcmp(name, "false") == 0)
+    return state->_false;
+  else if (strcmp(name, "STDIN") == 0)
     return state->_stdin;
   else if (strcmp(name, "STDERR") == 0)
     return state->_stderr;
@@ -1503,7 +1509,7 @@ void qi_decl(qi_state_t *state, char *name, qi_value_t *value) {
   _qi_decl(state, name, value, false);
 }
 
-qi_value_t *_qi_set(qi_state_t *state, bool is_pre, bool is_constant,
+qi_value_t *_qi_set(qi_state_t *state, bool is_pf, bool is_constant,
                     char *name, qi_value_t *value) {
   qi_ssize_t scopes_count = qi_list_length(state->scopes);
 
@@ -1531,7 +1537,7 @@ qi_value_t *_qi_set(qi_state_t *state, bool is_pre, bool is_constant,
 
         qi_lock_release(scope->lock);
 
-        return !is_pre && old ? old : value;
+        return !is_pf && old ? old : value;
       }
 
       qi_lock_release(scope->lock);
@@ -2123,7 +2129,7 @@ leave:
   return NULL;
 }
 
-qi_value_t *qi_index_set(qi_state_t *state, bool is_pre, qi_value_t *value,
+qi_value_t *qi_index_set(qi_state_t *state, bool is_pf, qi_value_t *value,
                          qi_value_t *index, qi_value_t *newvalue) {
   qi_value_t *meta;
   bool fail = false;
@@ -2138,12 +2144,12 @@ qi_value_t *qi_index_set(qi_state_t *state, bool is_pre, qi_value_t *value,
     if (qi_table_has(qi_get_metatable(value), index->value.string)) {
       qi_value_t *old;
 
-      if (!is_pre)
+      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);
 
-      return !is_pre && old ? old : newvalue;
+      return !is_pf && old ? old : newvalue;
     }
   }
 
@@ -2153,7 +2159,7 @@ qi_value_t *qi_index_set(qi_state_t *state, bool is_pre, qi_value_t *value,
       qi_value_t *old;
 
       LOCKED(value, {
-        if (!is_pre)
+        if (!is_pf)
           old = qi_list_index(value->value.list,
                               (qi_ssize_t)(index->value.number));
 
@@ -2165,7 +2171,7 @@ qi_value_t *qi_index_set(qi_state_t *state, bool is_pre, qi_value_t *value,
         qi_throw_format(state, "list index out of range: %s",
                         qi_repr(state, index, true));
 
-      return !is_pre && old ? old : newvalue;
+      return !is_pf && old ? old : newvalue;
     }
     break;
 
@@ -2174,13 +2180,13 @@ qi_value_t *qi_index_set(qi_state_t *state, bool is_pre, qi_value_t *value,
       qi_value_t *old;
 
       LOCKED(value, {
-        if (!is_pre)
+        if (!is_pf)
           old = qi_table_get(value->value.table.table, index->value.string);
 
         qi_table_set(value->value.table.table, index->value.string, newvalue);
       });
 
-      return !is_pre && old ? old : newvalue;
+      return !is_pf && old ? old : newvalue;
     }
     break;
 

+ 6 - 6
qirt.h

@@ -242,10 +242,10 @@ struct _qi_symbol_t {
   bool is_constant;
 };
 
-#define qi_set(state, is_pre, name, value)                                     \
-  (_qi_set((state), is_pre, false, (name), (value)))
-#define qi_bind(state, is_pre, name, value)                                    \
-  (_qi_set((state), is_pre, true, (name), (value)))
+#define qi_set(state, is_pf, name, value)                                     \
+  (_qi_set((state), is_pf, false, (name), (value)))
+#define qi_bind(state, is_pf, name, value)                                    \
+  (_qi_set((state), is_pf, true, (name), (value)))
 
 #define qi_length(state, value)                                                \
   (qi_make_number((state), _qi_length((state), (value))))
@@ -395,7 +395,7 @@ qi_value_t *qi_find(qi_state_t *state, char *name);
 qi_value_t *qi_get(qi_state_t *state, char *name);
 void qi_decl_const(qi_state_t *state, char *name, qi_value_t *value);
 void qi_decl(qi_state_t *state, char *name, qi_value_t *value);
-qi_value_t *_qi_set(qi_state_t *state, bool is_pre, bool is_constant,
+qi_value_t *_qi_set(qi_state_t *state, bool is_pf, bool is_constant,
                     char *name, qi_value_t *value);
 size_t _qi_length(qi_state_t *state, qi_value_t *value);
 qi_value_t *qi_del(qi_state_t *state, qi_value_t *value, qi_value_t *index);
@@ -403,7 +403,7 @@ bool _qi_truthy(qi_state_t *state, qi_value_t *value);
 qi_value_t *qi_cast(qi_state_t *state, qi_type_t type, qi_value_t *value);
 qi_value_t *qi_iter(qi_state_t *state, qi_value_t *value);
 qi_value_t *qi_index(qi_state_t *state, qi_value_t *value, qi_value_t *index);
-qi_value_t *qi_index_set(qi_state_t *state, bool is_pre, qi_value_t *value,
+qi_value_t *qi_index_set(qi_state_t *state, bool is_pf, qi_value_t *value,
                          qi_value_t *index, qi_value_t *newvalue);
 qi_value_t *qi_call(qi_state_t *state, qi_value_t *value, qi_list_t *pargs);
 qi_value_t *qi_call_debug(qi_state_t *state, qi_value_t *value,