これまでのあらまし
わたしはJavaシルバー本100ページ程度の知識しかないプログラミング超初学者です。
学習効率とノリ(めちゃくちゃ失礼な本音かもしれませんが...)でElixirを選びました。
現在、Enum関数とパイプライン演算子を用いた式の書き方を猛勉強しています。
また、わたし自身音楽家であることから、"ELixirでシンセサイザーをつくる"ことを目標にしています。その見地から理解した式を音楽に例えていく芸風で記事を連ねていくことにしました。
公式ドキュメント(英語) から、ひたすらEnumの関数を上から解いてみて、理解を記していきます。
Enum.chunk_every
iex> Enum.chunk_every(1..100,3)
[
[1, 2, 3],
[4, 5, 6],
'\a\b\t',
'\n\v\f',
[13, 14, 15],
[16, 17, 18],
[19, 20, 21],
[22, 23, 24],
[25, 26, 27],
[28, 29, 30],
[31, 32, 33],
'"#$',
'%&\'',
'()*',
'+,-',
'./0',
'123',
'456',
'789',
':;<',
'=>?',
'@AB',
'CDE',
'FGH',
'IJK',
'LMN',
'OPQ',
'RST',
'UVW',
'XYZ',
'[\\]',
'^_`',
'abc',
'd'
]
この式は、"1から100のリストを3個の整数ごとにまとめて出力する"式です。
途中記号や文字化けが入っているのは残念ながら仕様だそうです。
音楽に例えるとしたら、シンセサイザーからずっと流れているオシレーターの波形を一定周期でサンプリングを取り続けるみたいなイメージかと思います。
パイプライン演算子と&記法を用いてこう書き換えることができました。
1..100 |> Enum.chunk_every(3)
Enum.all?
iex>Enum.all?([2, 4, 6], fn x -> rem(x, 2) == 0 end)
true
これは、リストの中の数字を2で割ってあまりが全てゼロならtrueを返す、という構文のようです。
iex>[2, 4, 6] |> Enum.all?(& rem(&1, 2) == 0)
パイプライン演算子と&記法を用いてこう書き換えることもできました。
1..10 |> Enum.all?(& rem(&1, 2) == 0)
false
これは奇数があるので当然falseになりますね。
というわけで、Enum.all?は"条件に対してすべて符号する場合はtrueを返す"関数のようです。
音楽のメタファーにするなら...閾値以下の波形をすべて叩いて無音にしてしまう"ゲート"というエフェクターでしょうか。
Enum.any?
iex>Enum.any?([2, 4, 6], fn x -> rem(x, 2) == 1 end)
false
ストの中にひとつでもあまりが1になる要素があればtrueを返す、という構文でしょうか。
Enum.any?([2,3,4], fn x -> rem(x, 2) ==1 end)
true
これはtrueになるので、"リストのなかにひとつでもあまりが1になる要素があればtrueを返す"、という仮定は合っているようです。
書き換え
[2, 3, 4] |> Enum.any?(& rem(&1, 2)==1)
true
Enum.at
iex(10)> Enum.at([2, 4, 6], 0)
2
iex(11)> Enum.at([2, 4, 6], 2)
6
iex(12)> Enum.at([2, 4, 6], 4)
nil
これは見ていくに、リストのなかの要素をゼロから数え始めて指定の番数の値を返す、という関数のようです。ちょっとMIDIシーケンサーでこんな機能がありそうな気がします。
というわけで、ひたすらEnumの公式ドキュメントを辿って得意な音楽のメタファーを使いながら自己理解を深めていきます。
うまずたゆまず、頑張ります。
Kento Mizuno