Today’s TIL has a twist ending… so stick around.
Elixir has a shortcut for creating anonymous functions. I’ve always written:
greet = fn name -> "Hello, #{name}!" end
# which can be invoked
greet.("Travis")
# returns
"Hello, Travis!" However; I came across some tricky code with a case statement:
docs = case type do
:billing -> &[billing_act: &1]
:shipping -> &[shipping_act: &1]
end
# invocation
type = :billing
docs.("some customer")
# returns
[billing_act: "some customer"] This was very confusing to me, the fact that the anonymous function was a case form only further obfuscated what was happening. I thought it might be some case magic.
No. Apparently you can short cut the aforementioned anonymous function declaration:
greet = & "Hello, #{&1}!" You treat this as any other anonymous function. You can even have multi-arity functions:
greet = & "Hello, #{&1} #{&2}!"
# invocation
greet.("Travis", "Fantina")
# returns
"Hello, Travis Fantina!" In my case the case statement could have also been written:
docs = fn customer ->
case type do
:billing -> [billing_act: customer]
:shipping -> [shipping_act: customer]
end
end Plot twist: This is not a TIL, apparently I learned this at least four years ago. That initial case function… the author was me four years ago!