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

2014-07-17 Thread Matthew Flatt
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

2014-07-17 Thread Sam Tobin-Hochstadt
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

2014-07-17 Thread Asumu Takikawa
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

2014-07-17 Thread Robby Findler
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