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