mirror of
https://github.com/roc-lang/roc.git
synced 2025-07-23 14:35:12 +00:00
![]() Closure captures can be transient, but previously, we did not handle that correctly. For example, in ``` x = "" inner = \{} -> x outer = \{} -> inner {} ``` `outer` captures `inner`, but `inner` captures `x`, and in the body of `outer`, we would not construct the closure data for `inner` correctly before calling it. There are a couple ways around this. 1. Update mono to do something when we are passed the captured environment of a closure, rather than attempting to construct a call-by-name's captured environment before callign it. 2. Fix-up closures during canonicalization to remove captured closures that themselves capture, and replace them with their captures. This patch does (2), since (1) is much more involved and is not likely to bring a lot of wins. In general I think it's reasonable to expect captured environments, even if transient, to be fairly shallow, so I don't think this will produce very large closure environments. Closes #2894 |
||
---|---|---|
.. | ||
docs | ||
src | ||
tests | ||
Cargo.toml |