Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

allow multiple parameters using an underscore as name #1493

Draft
wants to merge 5 commits into
base: devel
Choose a base branch
from

Conversation

zerbina
Copy link
Collaborator

@zerbina zerbina commented Feb 22, 2025

Summary

Using an underscore as a parameter's name now makes the symbol
anonymous, allowing multiple parameters to use a single underscore.
This affects all routine definitions as well procedure type.

Details

The motivation is to not require one to give a name to unused
parameters, which is often the case for procedure type parameters and
sometimes for lambda expression parameters. It also makes the meaning
of a single underscore used in a definition context more consistent.

In semProcTypeNode (which is called for all parameter lists),
isDiscardUnderscore is called on the parameter symbol, marking it as
a gensym in case it's an underscore, thus preventing it from later
being added to the symbol table. The manual name check ignores
underscore parameters.

So that underscore parameters cannot be referenced in named parameter
passing, getNamedParamFromList ignores underscore parameters.


Notes for Reviewers

  • longer term, I think underscores should be handled the same in all
    definition positions (i.e., creating an anonymous entity)

They're now turned into gensyms, via (the misnamed)
`isDiscardUnderscore`, leading to them not being added to the symbol
table by `addParamOrResult`.

So that gensyms are handled properly, `instantiateBody` now calls
`addParams` - which calls `addParamOrResult` - instead of manually
adding all parameter symbols to the symbol table via `addDecl`.
Single underscore names in C don't have any special meaning. They're
mangled with their parameter position to yield a locally unique name.
If not ignored, they could be selected by named parameter passing,
which would mean that they're not really hidden anymore.
@zerbina zerbina added compiler/sem Related to semantic-analysis system of the compiler language-design Language design syntax, semantics, types, statics and dynamics. labels Feb 22, 2025
@zerbina
Copy link
Collaborator Author

zerbina commented Feb 22, 2025

I'm not exactly happy with the implementation yet. Forward declarations and re-definition checks also don't consider anonymous parameters at the moment.

An alternative implementation could use sfAnon to mark the parameters as anonymous, which might be better.

@@ -0,0 +1,9 @@
discard """
description: '''
An underscore parameter cannot be reference in named parameter passing.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
An underscore parameter cannot be reference in named parameter passing.
An underscore parameter cannot be referenced in named parameter passing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
compiler/sem Related to semantic-analysis system of the compiler language-design Language design syntax, semantics, types, statics and dynamics.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants