[racket-dev] src-id in identifier-binding for same-module definitions

From: Sam Tobin-Hochstadt (samth at cs.indiana.edu)
Date: Wed Jul 16 23:32:46 EDT 2014

Ok, I thought I had figured this out, but I was wrong.

Here's what I want to be able to do:

 - take an identifier in a fully-expanded source file
 - translate that identifier to some symbol in a predictable way
 - so that other references to that same (free-identifier=?)
identifier get translated to the same symbol

It's pretty easy to do this in a single module -- just keep a
free-id-table of all the identifiers mapping to gensyms. But I want to
be able to do this across modules, and across invocations of this
program. IOW, when I run my program on one source file, I'd like to
get a symbol for a provided definition that's the same symbol I get
when I run my program on a different source file containing a
reference to that definition.

Clearly this is possible, since Racket manages, but is there a way
that I can do it?

Sam

On Wed, Jul 16, 2014 at 7:55 AM, Matthew Flatt <mflatt at cs.utah.edu> wrote:
> Yes, it can be ".2", etc. The numbers are generated as needed to create
> distinct names --- deterministically for a given module compilation,
> assuming that all macros used by expansion are deterministic.
>
> At Wed, 16 Jul 2014 07:36:50 -0400, Sam Tobin-Hochstadt wrote:
>> Does that mean that I can/should just drop the .1 to get the defined name?
>> Can it also be .2 etc?
>>
>> Sam
>> On Jul 16, 2014 4:34 AM, "Matthew Flatt" <mflatt at cs.utah.edu> wrote:
>>
>> > That `posn1.1` is a unreadable symbol that stands for the symbol
>> > `posn1` plus some marks that distinguish it.
>> >
>> > In other words, `posn1.1` bridges (in an ugly way) the symbol-based
>> > world of module environments and the identifier-based world of syntax.
>> > In the future, I hope to shift module environments to be
>> > identifier-based to avoid these unreadable symbols.
>> >
>> > At Tue, 15 Jul 2014 09:10:26 -0400, Sam Tobin-Hochstadt wrote:
>> > > If you take this program and fully-expand it in the macro stepper:
>> > >
>> > > #lang racket
>> > > (struct posn (x y))
>> > > (define p1 (posn 1 2))
>> > >
>> > > You see that the residual program has an application of the `posn1`
>> > > function, which is the hidden constructor. And indeed, the
>> > > fully-expanded program has a definition of `posn1`. However, if you
>> > > click on the use of `posn1`, the macro stepper will tell you that it's
>> > > defined in this module as `posn1.1`, and provided as `posn1.1` as
>> > > well. If you write program to grovel through the fully-expanded
>> > > syntax, you get these same results as the `src-id` and
>> > > `nominal-src-id` from `identifier-binding`.
>> > >
>> > > Why is this? And is there a way to get from `posn1.1` to `posn1`
>> > reliably?
>> > >
>> > > Sam
>> >

Posted on the dev mailing list.