[racket] Racket macros that run on files

From: Patrick Mahoney (paddy.mahoney at gmail.com)
Date: Wed Nov 14 16:08:15 EST 2012

Thank you for the responses Vincent and Neil.

Neil, thanks for the information here-I will meditate on this and how to
utilize it.

-Patrick

On 4 November 2012 22:34, Neil Van Dyke <neil at neilvandyke.org> wrote:

> So you would like to be able to do things like rename an identifier,
> change "(if X Y)" to "(and X Y)", change "(if (not X) Y Z)" to "(if X Z
> Y)", etc.?
>
> If so, I would probably start by letting user specify transformation rules
> like for "syntax-case" or "syntax-parse", do "read-syntax", do some simple
> tree traversal of the syntax objects that tries the rules at each step,
> have a matching rule add to a list of "progedit" "replace" operations, and
> then finally feed those operations through "progedit".
>
> And alternative would be to use parse info from Check Syntax, perhaps with
> the user's transformation rules in effect.  I haven't thought that through,
> so it might be overkill.  If you go that direction, you might think of a
> different rules language, rather than "syntax-case" or "syntax-parse".
>
> One gotcha with "progedit" with syntax objects, depending on how you use
> it: comments are not usually in the syntax objects, and can get deleted if
> you are not careful, or left in the wrong place if you don't do additional
> work.  For example of changing "if" forms to "and" forms, you want to
> replace only the "if" keyword, not the entire form, so that:
>
>     (if X
>         ;; hi
>         Y)
>
> ends up looking like this:
>
>     (and X
>         ;; hi
>         Y)
>
> If the replace operation is for the entire "if" form, you will lose the
> comment:
>
>     (and X Y)
>
> For example of comments in wrong place, let's say you are getting rid of
> "not" around the condition of an "if" form by swapping the order of the
> arms.  Like in previous example, to preserve comments, you want your
> progedit replace operations to focus on small pieces that don't have
> important comments within them, so if you do that, then this:
>
>     (if (not X)
>         ;; X is false, so Y
>         Y
>         ;; X is true, so Z
>         Z)
>
> becomes:
>
>     (if X
>         ;; X is false, so Y
>         Z
>         ;; X is true, so Z
>         Y)
>
> The problem is that the comments are in the wrong places.  The current
> version of progedit doesn't have any magic for moving comments around --
> you'll have to figure out how you want comments moved, and then probably
> move the comments using progedit delete and insert operations, in addition
> to the syntax changes you are making.  An alternative way would be to have
> the syntax reader include syntax objects for comments, and then deal with
> it in pattern-matching and transformation that way.
>
> (I plan to add these notes about comments to the progedit documentation.
>  No promises on building in smarter handling of comments into progedit
> itself anytime soon, unless a get a chance to think more about a good
> approach for it.)
>
> Neil V.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20121114/b5aa73ad/attachment.html>

Posted on the users mailing list.