Hi,
in mathematics we use this syntax of • to represent (anonymous) functions. For instance ||•|| is then equivalent to writing x |–> ||x||.
My question is, is there such syntax in julia?
If not, I’d love to see the, for instance, bullet operator handle this shorthand in a future release. Do you agree?
They seem to have problems regarding how the “_” syntax should be used, more important, their representation does not seem well defined anymore, as for instance
A,B,C = rand(5), rand(5), rand(5)
maximum(_[1], [A,B,C])
could mean maximum(x -> x[1], [A,B,C])
, but also x -> maximum(x[1], [A,B,C])
, hence where x
is itself is an array of functions.
Therefore I just wanted to implement my own macro as follows:
- the replacement would be achieved by writing
@x(:x + 3)
, meaning x -> x + 3
- similarly
@x(f(:x, :y, 7, :x))
means (x,y) -> f(x, y, 7, x)
We then can automatically create problem cases like the ones above and by using composition ∘
or |>
we can create arbitrary complex functions, like @x(f(:x, :y, 7)) |> @x(:x^2) |> @x(print("The solution is $(:x)."))
.
How do I write such a macro and do you have a neater syntax idea?
By writing
macro x(f)
f.args = replace(f.args, :(:x) => :x)
return :(x -> $f)
end
I got a little of the functionality. One can for instance do this
julia> rdim = @x(rand(5, :x)) # 5 × x random arrays
julia> rdim(1)
5×1 Array{Float64,2}:
0.9939828371497994
0.773338508907532
0.8633776655992123
0.22892379107363436
0.39529414038536226
julia> rdim(3)
5×3 Array{Float64,2}:
0.146573 0.108516 0.327287
0.105098 0.111566 0.942984
0.713338 0.69219 0.877718
0.243916 0.561024 0.569137
0.787741 0.970282 0.0878656
You can find examples on this forum (search for partial application macro or something similar), and even some packages like
(I think there are others, but I can’t recall the names).
3 Likes