Suppose I have a function structure:
function NeighborLoop!(f::Function, a,b,c,d)
f(a,b,c,d)
end
In this case I have to double specify all the variables. Is there a smart and easy way to pass all variables from NeighborLoop!
into f
without having to double specify?
I would like to have this code structure, since in my real use case the NeighborLoop!
is inside of a package module.
Kind regards
How about
function neighbor_loop!(f::Function, args...)
f(args...)
end
1 Like
Almost I think?
The issue is:
julia> function func(f,args...)
for arg in args
println(args)
end
end
func (generic function with 1 method)
julia> func(nothing,1)
(1,)
julia> a = 1
1
julia> func(nothing,a)
(1,)
I would like to pass in the known name i.e. in this case a
. So it should be arbitrary number of variables and one should be able to call them using their variable name.
Kind regards
use a named tuple ?
Example:
julia> function func(f, nt::NamedTuple)
@show f([nt.a, nt.b, nt.c])
@show f(values(nt))
end
func (generic function with 1 method)
julia> func(sum, (;a = 1, b= 2, c =3, d = 4))
f([nt.a, nt.b, nt.c]) = 6
f(values(nt)) = 10
10
But if the keywords are statically known, probably it’s better to pass them as keyword arguments.
1 Like
Not sure what your goal is, but you seem to have a typo and need println(arg)
instead. That’s why you’re seeing a tuple instead of a number printed out, in your previous post.
1 Like
Thanks!
I want to do this basically, refer to a
inside of a function without passing it in as a variable, but through args
. It seems to work now:
let
function func(f,args...)
return a + 1
end
a = 1
println("value of a starts as: ", a)
b = func(nothing, a)
println("value of b is: ", b)
println("value of a ends as: ", a)
end
value of a starts as: 1
value of b is: 2
value of a ends as: 1
So I think I just try to modify my actual code to this pattern and report back
This example does not use args
at all. You post shere read somewhat misguided/confused but I cannot make out what you really wanted to ask. Can you step back on step and explain why you asked the original question, i.e. what you want to achieve in the end?
2 Likes
(In general, if you have a long list of arguments that you are passing around between lots of functions, e.g. shared parameters for a computational model, you might want to consider defining a data structure to encapsulate them.)
3 Likes
I generally wouldn’t suggest you to use this pattern a lot. Here func
accesses a
as a global variable. Having global variables is slow (if they are immutable, defining them as const
is already a lot faster). But it’s not only about speed; having functions depending on a global state that can change at any point is a fragile pattern. Although sometimes unavoidable, most of the times there is a better design. E.g., have a look at Parameters.jl as well.
1 Like
Thank you for the feedback everyone!
I will give it a little bit of a think and see how else I can structure my problem, thanks!
Kind regards