In the language I am working on, I store identifiers in preserved
syntax properties to attach type information to pieces of syntax.
More specifically, I store identifiers inside prefab structs, which
are then stored within preserved syntax properties. This seems to
work fine when my program spans a single module, but it breaks in
a confusing way when I use an identifier from another module.

Specifically, I have two identifiers from the “same” place, but the
macro that attaches the syntax property is used in two different
modules. I would expect these identifiers to be free-identifier=?,
but they are not. Looking at what identifier-binding returns, I get
the following results:

  (#<module-path-index:()> List #<module-path-index:()> List 0 0 0)
  (#<module-path-index:(rascal/prelude)> List 
#<module-path-index:(rascal/prelude)> List 0 0 0)

Obviously, the module path index values are different, but I don’t
know why or how to fix it. My attempt to create a minimal reproducible
test case led to me filing racket/racket#1495[1], but that issue
seems to be slightly different from my problem.

If I stick an identifier in a preserved syntax property, what are
the guarantees I have about it? Is using free-identifier=? on it
from another module dangerous in some way? The documentation doesn’t
seem to mention anything about this, but in the meantime, I’m
honestly a little unsure how to even begin to fix this (aside from
radically changing how my program works).

[1]: https://github.com/racket/racket/issues/1495

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to