|
|
@@ -899,7 +899,7 @@ qi_value_t *qi_make_ref(qi_state_t *state, char *name) {
|
|
|
}
|
|
|
|
|
|
if (!r)
|
|
|
- qi_throw_format(state, "reference to undefined symbol: '%s'", name);
|
|
|
+ qi_throw_format(state, "reference to an undefined symbol: '%s'", name);
|
|
|
|
|
|
qi_value_t *value = qi_make_value(QI_REFERENCE);
|
|
|
value->value.ref.name = name;
|
|
|
@@ -4371,6 +4371,18 @@ qi_value_t *qi_builtin_iter_next(qi_state_t *state, qi_size_t pargc,
|
|
|
return qi_iter_next(state, a);
|
|
|
}
|
|
|
|
|
|
+qi_value_t *qi_builtin_iter_end(qi_state_t *state, qi_size_t pargc,
|
|
|
+ qi_list_t *pargs) {
|
|
|
+ qi_value_t *a = qi_list_data(pargs, 0);
|
|
|
+
|
|
|
+ if (!qi_is_iter(state, a))
|
|
|
+ qi_throw_format(state,
|
|
|
+ "expected first argument to be an iterator, but got: %s",
|
|
|
+ _qi_type(state, a));
|
|
|
+
|
|
|
+ return qi_make_boolean(state, qi_iter_end(state, a));
|
|
|
+}
|
|
|
+
|
|
|
qi_value_t *qi_builtin_deref(qi_state_t *state, qi_size_t pargc,
|
|
|
qi_list_t *pargs) {
|
|
|
qi_value_t *a = qi_list_data(pargs, 0);
|
|
|
@@ -4618,6 +4630,7 @@ static void qi_state_setup(qi_state_t *state) {
|
|
|
qi_add_builtin(state, "ref", 1, qi_builtin_ref);
|
|
|
qi_add_builtin(state, "iter", 1, qi_builtin_iter);
|
|
|
qi_add_builtin(state, "iter_next", 1, qi_builtin_iter_next);
|
|
|
+ qi_add_builtin(state, "iter_end", 1, qi_builtin_iter_end);
|
|
|
|
|
|
qi_add_builtin(state, "deref", 1, qi_builtin_deref);
|
|
|
qi_add_builtin(state, "ref_set", 2, qi_builtin_ref_set);
|