nhpip

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

derek-zhou

Or do both: have a defp with all the arguments, then capture specialized versions to be used later.

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

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

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

Where Next?

Popular in Discussions Top

PragTob
Hey everyone, this has been on my mind for some time and I’d love your input on it! TLDR: I feel like maps are superioer for storing and...
New
rms.mrcs
A couple of days ago I was discussing with a friend about different approaches to write microservices. He said that if he was going to w...
New
acrolink
How does the two languages compare when it comes to server side application development? Any experiences or ideas? Thank you.
New
mikl
I wanted to capitalize a string, and tried using String.capitalize(). That generally works well, until you try to capitalize a word like...
New
klo
Got a question about when to concat vs. prepending items to list then reversing to achieve appending. So i know lists boil down to [1 | ...
New
matthias_toepp
I’d love to hear what people think about Wisp, the new Gleam web framework started by Gleam’s primary creator Louis Pilfold. Gleam, alon...
New
arcanemachine
https://nitter.net/josevalim/status/1744395345872683471 https://twitter.com/josevalim/status/1744395345872683471
New

Other popular topics Top

baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New

We're in Beta

About us Mission Statement