Say I have

```
args = :(x,y)
```

and I’d like to build

```
goal = :(function(x,y) 0 end)
```

The closest I’ve been able to get is

```
:(function($args...) 0 end)
```

but that simplifies to

```
:(function ((x, y)...,)
0
end)
```

Anyone know a way to do this?

Nevermind, I got it!

```
Main> Expr(:function, args, 0)
:(function (x, y)
0
end)
```

tshort
January 6, 2018, 1:19am
3
Here’s one way. `dump`

is useful to figure out what needs to go in the `Expr()`

call.

```
julia> args = :(x, y)
julia> Expr(:function, args, :(0))
:(function (x, y)
0
end)
```

tshort
January 6, 2018, 1:19am
4
You beat me to it! I need to learn to refresh.

Shouldn’t this work, though?

```
julia> args = [:x, :y]
2-element Array{Symbol,1}:
:x
:y
julia> :(function($(args...)) 0 end)
ERROR: syntax: expected "(" in function definition
```

1 Like

Yep, good advice - this is how I figured it out too

Finding a lot of weird corner cases with this. Another is that `quote x end`

and `:(x)`

are not the same:

```
Main> args = (:x, :y)
(:x, :y)
Main> :($args)
(:x, :y)
Main> quote $args end
quote # none, line 1:
(:x, :y)
end
```

I got it; it failed because without a comma, the parentheses were ignored:

```
julia> :(function ($(args...),) 0 end)
:(function (x, y) # REPL[4], line 1:
0
end)
```

1 Like

There was another one that was tricky: Turn `[:a,:b]`

into `:((a,b))`

. I found a solution but it’s not at all elegant. I’ll add it to Simple metaprogramming exercises/challenges .