There are some similar facilities in base/cartesian.jl and IProfile.jl. Seems like it might be time to centralize some of this. Perhaps we should expand base/meta.jl?
Best, --Tim On Thursday, January 30, 2014 06:40:36 AM Andrew Burrows wrote: > Hi > > Recently I've been writing some macros that work on functions. Generally I > want to take a function, change something about it and then output the > changed function. In my experience the AST for a function can vary quite a > bit and it is only as I add more test-cases for my macros that I realize > about new forms that are possible. As an example the AST varies a good deal > depending on whether the function is named or anonymous and then each of > those has a shorthand form too, so that is 4 possibilities before we get > into type parameters, keywords args, module-names etc. > > My main question is "Am I missing something here?" is there a document that > describes all the options when declaring a function or all the possible AST > that can be used to declare a function? Is all macro writing this tricky or > are functions especially bed? Or is there some neat trick I'm missing to > make this all simpler? > > As I have already written two macros that work on functions and think I may > write more I wrote a > MetaTools<https://github.com/burrowsa/Fixtures.jl/blob/master/src/metatools > .jl>module that allows me to reuse my AST parsing code between macros (and > reuse a lot of the testing effort). It allows you to write macros that > parse the AST into a standardized form (like a web browser's DOM but for > Julia functions) manipulate it then convert it back to AST. > > Here is a somewhat silly example: > > macro rename_to_bob(ex::Expr) > # Parse the function into a function object model > pfunc = ParsedFunction(ex) > > # manipulate the function object model > pfunc.name = :bob > > # output the result > return esc(quote > $(emit(pfunc)) > end) > end > > > A more realistic example is the @commutative macro found at the end of this > file <https://github.com/burrowsa/Fixtures.jl/blob/master/src/metatools.jl>. > > The module is pretty well > tested<https://github.com/burrowsa/Fixtures.jl/blob/master/test/metatools.j > l> and I was wondering if others would find it useful? If so I could spin it > out as its own package. > > Cheers > Andy
