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

From: Sam Tobin-Hochstadt (samth at cs.indiana.edu)
Date: Thu Jul 17 10:41:36 EDT 2014

Ah, now I know what I was doing wrong. I was using identifier-binding for
references, but not for definitions. Now that I'm using it in both places,
things seem to work.

Thanks!
Sam
On Jul 17, 2014 3:08 AM, "Matthew Flatt" <mflatt at cs.utah.edu> wrote:

> Does `identifier-binding` not give you the symbol that you need?
>
> At Wed, 16 Jul 2014 23:32:46 -0400, Sam Tobin-Hochstadt wrote:
> > 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
> > >> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/dev/archive/attachments/20140717/159ce288/attachment.html>

Posted on the dev mailing list.