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 <n...@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. > >
____________________ Racket Users list: http://lists.racket-lang.org/users