Up for grabs issue: https://github.com/JuliaLang/julia/issues/6520. If anyone is interested in doing a bit of metaprogramming, this is a good opportunity.
On Mon, Apr 14, 2014 at 2:47 AM, Jameson Nash <[email protected]> wrote: > I would pick (4): sprintf should be modified to deal with it. > > My reason: sprintf knows how many arguments it is expecting, so if it > sees a `...` on the last argument, it could easily emit code to > extract the elements that it needs > > > Also (1) / (2): splatting arguments is something that happens in a > function call at runtime. A macro is neither since it deals with the > AST (the form of the code) before it gets executed, at compile time. > Since X doesn't exist at compile time, `X...` can't be expanded yet > either. However, the sprintf macro can choose to take steps to > accommodate this syntax, or it can choose to make it an error. > Currently it's just undefined, probably because nobody has tried it > before, and then opened an issue when it didn't work. > > > On Mon, Apr 14, 2014 at 2:37 AM, Jeff Waller <[email protected]> wrote: > > That's pretty cool, but I have a followup. > > > > Does this mean > > 1) Writing macros is implicitly harder because they don't deal with > > (splatted) collections as easy as functions? > > 2) This is not really important because it hardly is ever done? > > 3) sprintf should be re-written as a function? > > 4) sprintf should be modified to deal with this? > > 5) sprintf can't be modified easily to deal with this and still be > efficient > > (see #1-#3) > > > > On Sunday, April 13, 2014 4:31:57 PM UTC-4, John Myles White wrote: > >> > >> As far as the macro is concerned, the splat isn’t executed: it’s just > >> additional syntax that gets taken in as a whole expression. > >> > >> The contrast between how a function with splatting works and how a macro > >> with splatting works might be helpful: > >> > >> julia> function splat(a, b...) > >> println(a) > >> println(b) > >> return > >> end > >> splat (generic function with 2 methods) > >> > >> julia> splat(1, 2, 3) > >> 1 > >> (2,3) > >> > >> julia> splat(1, [2, 3]...) > >> 1 > >> (2,3) > >> > >> julia> macro splat(a, b...) > >> println(a) > >> println(b) > >> :() > >> end > >> > >> julia> @splat(1, 2, 3) > >> 1 > >> (2,3) > >> () > >> > >> julia> @splat(1, [2, 3]...) > >> 1 > >> (:([2,3]...),) > >> () > >> > >> > >> — John > >> > >> On Apr 13, 2014, at 1:20 PM, Jeff Waller <[email protected]> wrote: > >> > >> > Likewise I am having problems with @sprintf > >> > > >> > Is this because @sprinf is macro? The shorthand of expanding a printf > >> > with format the contents of an array is desirable. I would have > expected > >> > the ... operator to take an array of length 2 and turn it into 2 > arguments. > >> > > >> > julia> X=[1 2] > >> > 1x2 Array{Int64,2}: > >> > 1 2 > >> > > >> > julia> @sprintf("%d%d",1,2) > >> > "12" > >> > > >> > julia> @sprintf("%d%d",X...) > >> > ERROR: @sprintf: wrong number of arguments > >> > > >> > julia> @sprintf("%d%d",(1,2)...) > >> > ERROR: @sprintf: wrong number of arguments > >> > > >> > julia> @sprintf("%d",X...) > >> > ERROR: error compiling anonymous: unsupported or misplaced > >> > expression ... in function anonymous > >> > in sprint at io.jl:460 > >> > in sprint at io.jl:464 > >> > > >> > julia> macroexpand(quote @sprintf("%d%d",X...) end) > >> > :($(Expr(:error, ErrorException("@sprintf: wrong number of > >> > arguments")))) > >> > > >> > > >
