-
Notifications
You must be signed in to change notification settings - Fork 39
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
zerbina
wants to merge
5
commits into
nim-works:devel
Choose a base branch
from
zerbina:underscore-parameters
base: devel
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
This file contains 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
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.
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 |
saem
reviewed
Feb 22, 2025
@@ -0,0 +1,9 @@ | |||
discard """ | |||
description: ''' | |||
An underscore parameter cannot be reference in named parameter passing. |
There was a problem hiding this comment.
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.
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.
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 asa 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
definition positions (i.e., creating an anonymous entity)