aboutsummaryrefslogtreecommitdiff
path: root/environment.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-09-27 14:45:06 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-09-27 14:45:06 -0400
commit9b15799e73b2d8342b815de1715c85c3a1bc27d7 (patch)
tree9ec4d0155579676f4d70a70774ae3cf3b7f7393c /environment.c
parentb26da60f2f64d279d6abc682bcef4b74638ae7d3 (diff)
Support iterating over thunks that always return non-null values (useful
for infinite loops)
Diffstat (limited to 'environment.c')
-rw-r--r--environment.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/environment.c b/environment.c
index 050fac29..4c261438 100644
--- a/environment.c
+++ b/environment.c
@@ -522,14 +522,15 @@ env_t *for_scope(env_t *env, ast_t *ast)
}
case FunctionType: case ClosureType: {
auto fn = iter_t->tag == ClosureType ? Match(Match(iter_t, ClosureType)->fn, FunctionType) : Match(iter_t, FunctionType);
- if (fn->ret->tag != OptionalType)
- code_err(for_->iter, "Iterator functions must return an optional type, not %T", fn->ret);
+ // if (fn->ret->tag != OptionalType)
+ // code_err(for_->iter, "Iterator functions must return an optional type, not %T", fn->ret);
if (for_->vars) {
if (for_->vars->next)
code_err(for_->vars->next->ast, "This is too many variables for this loop");
const char *var = Match(for_->vars->ast, Var)->name;
- set_binding(scope, var, new(binding_t, .type=Match(fn->ret, OptionalType)->type, .code=CORD_cat("$", var)));
+ type_t *non_opt_type = fn->ret->tag == OptionalType ? Match(fn->ret, OptionalType)->type : fn->ret;
+ set_binding(scope, var, new(binding_t, .type=non_opt_type, .code=CORD_cat("$", var)));
}
return scope;
}