Skip to content

Spec is unclear on function body identifier context #1574

@tomstuart

Description

@tomstuart

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 by typeuse) 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 the typeuse 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 when typeuse 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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions