Add a missing case to the lambda lifting transformation#6093
Merged
Add a missing case to the lambda lifting transformation#6093
Conversation
The encloser was not keeping track of the fact that `x` in
x = <binding>
<body>
will not be floated, and will shadow let-rec variables in <body>,
so we need to remove `x` from the variables to avoid enclosing.
Contributor
|
Nice |
aryairani
approved these changes
Jan 7, 2026
Contributor
aryairani
left a comment
There was a problem hiding this comment.
passed CI with moderate effort 💪
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR fixes an oversight in the lambda lifter.
The first step of the process is to enclose terms that will be floated, so that they take their local references as arguments. We avoid adding arguments for references that will become part of the overall let-rec. However, this step was missing that lets could shadow the let-rec variables, so it would avoid enclosing these shadowing variables.
For instance, in code of the form
barwould not havefooenclosed, even though itsfooreference is the inner one, not the top level.Fixes #5889, which was caused by the test using a
resultvariable, and the test process tweaking the code to useresultto refer to the overall test result (I think).