Hi Andy,

Your meta package looks great!  I absolutely think that you should split it 
out in a separate package.  I've been playing around with generating OpenCL 
code from julia's AST (both the lowered typed and untyped forms) and I 
could reuse a lot of your work (I've only started parsing the untyped 
ast).  There is a lot of redundant code lying around which accomplishes 
similar things.  It makes sense to consolidate efforts to make working with 
Julia's AST easier.

Best,
Jake

On Thursday, January 30, 2014 9:40:36 AM UTC-5, 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.jl> 
> and 
> I was wondering if others would find it useful? If so I could spin it out 
> as its own package.
>
> Cheers
> Andy
>
>
>
>

Reply via email to