Closed tomstuart closed 1 year ago
Yes, thanks for pointing out! There is a composition missing. Please see #1578 for a fix.
Thank you! #1578 does a good job of clarifying that (contrary to my guess above) the typeuse
production is supposed to include only the parameter identifiers in $I'$, with these and the local variable identifiers getting composed with the initial context $I$ in the func
production to form the local context $I''$ for the function body.
Both would work, of course, and I believe your guess was indeed my original intention. But I just figured that the patch in #1578 avoids duplicating the composition.
Yeah, it’s neater this way — typeuse
is self-contained and only reports any parameter identifiers, and then func
is responsible for assembling the pieces. I like it.
As far as I can tell, the text format spec doesn’t explain how a module’s initial identifier context should reach the body of a function definition, which I assume it must somehow.
The
func
production synthesises an identifier context $I''$ for the function body by composing $I'$ (synthesised bytypeuse
) with a context containing the function definition’s local variable identifiers, so the inherited attribute $I$ containing the module’s initial context is not directly used. But thetypeuse
production itself also discards $I$: the $I'$ in its synthesised attribute contains only the parameter identifiers. The only syntactic occurrence of $I$ in these productions is whentypeuse
looks up the definition of the function’s type.It’s therefore unclear how the remaining contents of $I$ are made available to the function body. The prose accompanying the
typeuse
production does mention “the updated identifier context including possible parameter identifiers” (emphasis mine), which perhaps implies that $I'$ is intended to be formed by extending the inherited attribute $I$ rather than discarding it (e.g. $I' = I \oplus \lbrace \mathsf{locals}~(\epsilon)^n \rbrace$ etc), but that’s just a guess.How is this intended to work? Can the spec be updated to clarify?