Some slight additions to Kais message:
On 03/08/2025 17:25, Kai Prott wrote:
Hi,
what I have used In the past (and that I am fairly confident works) is
exactly what you say: use `uniqFromTag` or `mkSplitUniqSupply`.
According to the documentation, "the payload part of the Uniques
allocated from this UniqSupply are guaranteed distinct wrt all other
supplies, regardless of their 'tag'."
(Assuming the unique does not overflow it's number of bits)
If you read on the docs refer to an edge case in the next lines. GHC
contains a (limited) number of fixed/"built in" uniques. GHC itself
never creates uniques with the same tag as those fixed ones on the fly
so there is no risk of collision. However if you explicitly use this tag
it could happen and then compilation could go wrong. Outside of this
that is correct.
As far as I know, end users should not get to see a unique and it
should not influence compilation, so the Tag is only relevant for
plugin/GHC devs for debugging.
Uniques influence code generation slightly, as they are part of internal
symbol names. They should however not affect the behaviour of the
program. This doesn't matter often, but when it does it really does.
Also just curious: why do you need to construct a unique? Before the
GHC renamer a plugin can get away with generating essentially strings
that are "unique" and use them in `mkUnqual` or similar.
Most of the time, I just generate a `RdrName` with a prefix that would
not be allowed in source code with an incrementing suffix that I
manage myself.
I have not checked if a plugin-generated name has to be a valid
Haskell name nowadays. However, it worked in the past.
And just for completeness if someone else stumbles across this: After
the GHC renamer in `CoreM`, `TcM` (and others) one can just use
`getUniqueM` or `getUniqueSupplyM`.
Best wishes,
Kai Prott
On August 2, 2025 7:08:10 PM GMT+02:00, Wolfgang Jeltsch
<wolfg...@well-typed.com> wrote:
Hello, again! After some more digging, I came to the conclusion
that `uniqFromTag` is likely what I should use. However, what
exactly is the tag for? The note „Uniques and tags“ only says the
following:
The tag […] is typically used to make it easier to distinguish
uniques constructed by different parts of the compiler.
Who distinguishes uniques using tags: the compiler, compiler
developers when reading debugging output, or end users? Does the
choice of tag influence the behavior of the compiler other than
with respect to messages? The documentation of `mkSplitUniqSupply`
says that the tag “is mostly cosmetic”. If it is only *mostly*
cosmetic, what aspects of it are not cosmetic? In the end, how do
I choose a tag for uniques generated by a plugin? Is the choice
essentially irrelevant? Do I have to prevent clashes with tags
used by GHC or other plugins? Looking forward to insights. 🙂 All
the best, Wolfgang Am Samstag, dem 02.08.2025 um 16:16 +0300
schrieb Wolfgang Jeltsch:
Hello! I want to generate AST fragments in a source plugin,
and for this I need to generate fresh (local) names. My
current approach is to use `mkSystemName`, but it, like many
of the other name-generating operations, needs a value of type
`Unique`. How can I generate such values? It seems that the
`Hsc` monad doesn’t carry a value of type `UniqueSupply` with
it. All the best, Wolfgang
------------------------------------------------------------------------
ghc-devs mailing list ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs