Re: [racket-dev] src-id in identifier-binding for same-module definitions
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 mfl...@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 mfl...@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 _ Racket Developers list: http://lists.racket-lang.org/dev
Re: [racket-dev] src-id in identifier-binding for same-module definitions
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 mfl...@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 mfl...@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 mfl...@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 _ Racket Developers list: http://lists.racket-lang.org/dev
[racket-dev] flatten-begin
Hi all, I was wondering what people think about a potential API addition to the `syntax/flatten-begin` library. Something like `flatten-begin*` (or a less terrible name) that would recursively flatten `begin` expressions like the `flatten` function does for plain lists. i.e., (flatten-begin* #'(begin (begin 1 2) 3 4)) = (list #'1 #'2 #'3 #'4) as opposed to (flatten-begin #'(begin (begin 1 2) 3 4)) = (list #'(begin 1 2) #'3 #'4) Would that be useful? I keep finding myself writing functions like this. Cheers, Asumu _ Racket Developers list: http://lists.racket-lang.org/dev
Re: [racket-dev] flatten-begin
Why doesn't flatten-begin already do this? Robby On Friday, July 18, 2014, Asumu Takikawa as...@ccs.neu.edu wrote: Hi all, I was wondering what people think about a potential API addition to the `syntax/flatten-begin` library. Something like `flatten-begin*` (or a less terrible name) that would recursively flatten `begin` expressions like the `flatten` function does for plain lists. i.e., (flatten-begin* #'(begin (begin 1 2) 3 4)) = (list #'1 #'2 #'3 #'4) as opposed to (flatten-begin #'(begin (begin 1 2) 3 4)) = (list #'(begin 1 2) #'3 #'4) Would that be useful? I keep finding myself writing functions like this. Cheers, Asumu _ Racket Developers list: http://lists.racket-lang.org/dev _ Racket Developers list: http://lists.racket-lang.org/dev