※冒頭いきなりですが、Elixirに限らずな話かと思います、すんません。
初見ゴロシな式に出会った
インターネッツでelixirについて色々調べていたら、下記のコードに出会いました。
この処理が↓
Enum.reduce([1, 2, 3], fn(a, b) -> a + b end)
最終的にこう書ける↓
Enum.reduce(1..3, &+/2)
え、、、?
初見殺しな感じがすごい、、、
というか、僕は初見で死んだ、、、
ので、一歩ずつ噛み砕いてみました。
[1, 2, 3]は1..3という書き方ができる
rangeという書き方です。
これは、見ればなんとなくわかると思います。
直接書いてみるとわかるのですが、単純にリストが返ってくるわけではなさそうです。
iex(21)> [1,2,3]
[1, 2, 3]
iex(22)> 1..3
1..3 #[1, 2, 3]のリストになるわけではない
fn(a, b) -> a + b endは&+/2という書き方ができる
匿名関数という書き方です。
&を使うことで、関数の記述量を省略することができます。
iex(24)> x = fn(a,b) -> a + b end
#Function<13.91303403/2 in :erl_eval.expr/5>
iex(25)> x.(1,2)
3
iex(26)> y = &(&1 + &2)
&:erlang.+/2
iex(27)> y.(1,2)
3
ここからさらに、&1と&2を省略できるようでした。
「+」は引数を2つもつ関数(+/2)と表現するようです。(関数という表現の仕方であってるか...?)
iex(26)> y = &(&1 + &2)
&:erlang.+/2
iex(27)> y.(1,2)
3
iex(28)> z = &(+/2)
&:erlang.+/2
iex(29)> z.(1,2)
3
さらに()も省略すると、
iex(28)> z = &(+/2)
&:erlang.+/2
iex(29)> z.(1,2)
3
iex(30)> zz = &+/2
&:erlang.+/2
iex(31)> zz.(1,2)
3
最初に出てきた式になりましたね。
まとめ
いかがでしたでしょうか?
初見のナニコレ感はすごいですが、ちゃんと調べるとほほーとなりました。
elixirはまだまだわからないことだらけですが、こうやって噛み砕いて少しづつ進んでいくのは、とても楽しい時間ですね。