nhpip
Use of anonymous functions (closures)
Recently I’ve found myself with code that looks something like:
def foo(arg1, arg2, arg3...argN) do
# Do some work, creating variables
var1 = ...
var2 = ...
cond do
Keyword.get(foo, :foobar) == abc && var1 == ... ->
res =
# Some more work using data in this conditional and variables before the cond
cond1_do_something(res, ....)
Keyword.get(foo, :barfoo) == cba && var2 == ... ->
res =
# Some more work using data in this conditional and variables before the cond
cond2_do_something(res, ....)
...
end
end
The variables res1..N in the conditionals are computed using data computed before the cond as well as the data in each conditional, but the algorithm in each conditional is similar.
What I’ll do is create an anonymous function/closure to assist:
def foo(arg1, arg2, arg3...argN) do
# Do some work, creating variables
anon_fn_scope_1 =
fn args ->
# Do work using variables here that are a closure
# as well as the args passed to me
end
cond do
Keyword.get(foo, :foobar) == abc && var1 == ... ->
res = anon_fn_scope_1.(abc, var1 ...)
cond1_do_something(res, ....)
Keyword.get(foo, :barfoo) == cba && var2 == ... ->
anon_fn_scope_2 =
fn ->
v1 = ...
anon_fn_scope_1.(cba, var2, v1)
end
cond2_do_something(anon_fn_scope_2, ....)
...
end
end
Is that idiomatic Elixir? Using anonymous functions as closures to compute similar results later.
Most Liked
derek-zhou
Or do both: have a defp with all the arguments, then capture specialized versions to be used later.
benwilson512
I think it’d be more common for me to make those defps and just pass in all the args in each case. However I think the thing you’re doing is just fine, and a nice use of functions!
Last Post!
VOUwCNOD
It is not an idiomatic Elixir. But, just to clarify, idiomatic means common, there is nothing new, so there is no progress, no inventions.
The best use of closure would be to model out computations in closures. Consider this code:
ttrue = fn t, _f -> t end
ffalse = fn _t, f -> f end
aand = fn l, r -> l.(r, ffalse).(ttrue, ffalse) end
oor = fn l, r -> l.(ttrue, r).(ttrue, ffalse) end
You can figure out the rest yourself
Popular in Discussions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









