YC wrote:
Hi all -

continuing the metacircular interpreter topic, at this point I am looking at
the hygiene issue.  Without trying to implement a full solution that include
syntax and identifier objects, it seems that hygiene can be addressed via
just substituting lexical identifiers introduced during the expansion
process.

It seems doable to me because:

   - the non lexical identifiers all have to resolve to an existing binding
   in the transform environment or throws compilation error - so they don't
   need special handling
   - since the interpreter will expand all parsed code, the substitution
   process can be ensured to be unique so there are no name conflicts
   (capturing or being captured)
   - basically lambda is the only place that I am introducing lexical
   binding (maybe case-lambda as well once I get to it), so substitution is
   localized - what I need is to ensure that it's not too aggressive and ending
   up substituting variables introduced by nested expressions

The above basically automates CL's gensym approach to hygiene AFAICT.

I am sure this has been tried before - does anyone see/know of issues with
the substitution approach above?  Any ideas are appreciated, thanks,
yc

If you are only supporting syntax-rules, then I recommend implementing the algorithm from "Macros that Work" by Clinger and Rees. Hygienic macro expansion does typically involve alpha-conversion---renaming lexical variables to fresh names. The challenge, as you mention above, is in not renaming too eagerly.

If you're looking for code, SLIB has implementations of several hygienic macro expanders, including the one from "Macros that Work". SLIB does not run in Racket (mostly because it does not respect Racket's separation of phases), but you might be able to extract and port the code you need, or use it as inspiration.

Ryan


On Wed, Dec 8, 2010 at 12:19 PM, YC <yinso.c...@gmail.com> wrote:

Thanks Robby!


On Wed, Dec 8, 2010 at 4:13 AM, Robby Findler <ro...@eecs.northwestern.edu
wrote:
PS: check out this paper for an algorithm:

 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.54.8909

Robby

On Wed, Dec 8, 2010 at 6:11 AM, Robby Findler
<ro...@eecs.northwestern.edu> wrote:
Yes, outside in. Inside out doesn't work because the expander only
knows where the inside is when it sees a core (fully expanded) form.

Robby



------------------------------------------------------------------------

_________________________________________________
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/users

_________________________________________________
 For list-related administrative tasks:
 http://lists.racket-lang.org/listinfo/users

Reply via email to