diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-09-27 14:45:06 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-09-27 14:45:06 -0400 |
| commit | 9b15799e73b2d8342b815de1715c85c3a1bc27d7 (patch) | |
| tree | 9ec4d0155579676f4d70a70774ae3cf3b7f7393c /environment.c | |
| parent | b26da60f2f64d279d6abc682bcef4b74638ae7d3 (diff) | |
Support iterating over thunks that always return non-null values (useful
for infinite loops)
Diffstat (limited to 'environment.c')
| -rw-r--r-- | environment.c | 7 |
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; } |
