Fix issue with calling generics #81
Merged
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.
Issue #80 identified a case where the resolver would hang when calling a generic function with a parameter whose name matched the name of the argument.
This occurred due to the order of resolution. Since we resolved bindings in a depth-first fashion, we simply ended up resolving a generic parameter to itself.
One way to resolve this would have been to synthesize new names for each parameter in the scope of a local binding. But generating names and ensuring they are all unique is annoying. Instead, we switch the order of resolution. When binding generic args, we first resolve the arguments before traversing the body.
That is, for a replacement series
int -> x -> x
We previously did
int -> (x -> x)
whereas now we do
(int -> x) -> x
Since the top-level (LHS) is always concrete, this process must terminate.