Thanks, 
So in order to create the quote/end block you use:
  newxpr = Expr(:block)
And the newxpr.args is the array field of the QuoteNode which stores each 
expression?

Edit:
I can see now this is actually explained a bit in the advanced macro 
example in documentation.



On Thursday, April 23, 2015 at 1:10:15 PM UTC-7, Patrick O'Leary wrote:
>
> On Thursday, April 23, 2015 at 2:36:45 PM UTC-5, Kuba Roth wrote:
>>
>> This is my first  time writing macros in Julia. I've read related docs 
>> but could not find an example which works with the arbitrary number of 
>> arguments. 
>> So in my example below the args... works correctly with string literals 
>> but for the passed variables it returns their names and not the values.
>
>
> Here's the result of the last thing you called (note that I don't even 
> have testB and testC defined!)
>
> julia> macroexpand(:(@echo testB testC))
> :(for #6#x = (:testB,:testC) # line 3:
>         print(#6#x," ")
>     end)
>
> What ends up in `args` is the argument tuple to the macro. Typically, you 
> wouldn't process that in the final output--otherwise you could just use a 
> function! Instead, you'd splice each argument individually (`$(args[1])`, 
> `$(args[2])`, etc.) using a loop in the macro body, with each element of 
> the loop emitting more code, then gluing the pieces together at the end.
>
> Style notes: Typically, no space between function/macro name and formal 
> arguments list. Multiline expressions are easier to read in `quote`/`end` 
> blocks.
>
> Anyways, here's one way to do sort of what you want in a way that requires 
> a macro (though I still wouldn't use one for this! Didactic purposes only!):
>
> macro unrolled_echo(args...)
>     newxpr = Expr(:block) # empty block to hold multiple statements
>     append!(newxpr.args, [:(print($arg, " ")) for arg in args]) # the 
> arguments to the :block node are a list of Exprs
>     newxpr # return the constructed expression
> end
>

Reply via email to