前回の記事で、リストとタプルをやってみたけど、どうも色々解釈が別にあるようだ。
elixirではいわゆる伝統的な配列というのはタプルのこと
らしい。ンゴップ。
ちょっと色々脳みそ整理して整頓もしておきたい。
リストの構造
リストというのは、HeadとTailから出来ているらしい。
Headは値で、Tailはリストだ。
えぇ〜! Headは値でTailはリストの再帰的構造なのかぃ!?
誰もが『なんのこと?』ってなると思うけど、つまりこういうこと。
3という数字を一つ含むリストは、
3という数値を持つHeadと、空のリストのTailを組み合わせたリスト
はい?
3というHeadと、[]というTailで、[3]というリストになる
ってことらしい。
前回の、リストの先頭に0を追加する式があったと思うんだけど、そのフォーマットで[3]
を表すと、
[3 | [] ]
つまり、Headは単数の数値で、Tailはリストになっていて、その2つが組み合わさったものがリスト、という、なんとも再帰的な構造をしているらしい。
これ絶対わからん。他の言語やってたらまずもってわからん。
でも、実に興味深いね!!
こういう変態的な(大変失礼)構造って、案外ゾクゾクしてくるよな。自分だけが知ってる!なんて錯覚起こしたりもするだろうけどね。
今のところelixirって全〜〜〜然人気ないし、今なら使用者も少ないと思うし、早い段階でelixir使いの人間として頑張れる。
モチベーションもアップするってもんでしょ。
で、じゃぁリストが[2, 3]
だったらどういう構造なわけ?ってなるけど、これはこうらしい。
[2 | [3 | [] ] ]
2
がHead。[3]
がTailだけど、[3]
は今しがた説明したみたいに、[3 | [] ]
となるので、結果的に入れ子になった状態になる。再帰的だ。
そしてもしリストが[1, 2, 3]
であれば、[1 | [2 | [3 | [] ] ] ]
となるのは理解できると思う。
これをインタラクティブなシェルで実際に試してみようと思う。
1 2 3 |
iex> [1 | [2 | [3 | [] ] ] ] [1, 2, 3] |
なんということでしょう!!!
匠の力で [1 | [2 | [3 | [] ] ] ]
は [1, 2, 3]
として蘇ったのです!
(;´Д`)ハァハァ
HeadとTailもパターンマッチで値を変数に束縛とかしちゃってみようと思う。
1 2 3 4 5 6 7 |
iex> [a | b] = [1 | [2 | [3 | [] ] ] ] [1, 2, 3] iex> a 1 iex> b [2, 3] |
なんということでしょう!!!
匠の力でHead(先頭の値)とTail(先頭以外のリスト)にわかれたのです!!!
(;´Д`)ハァハァ
だからどうした?
そう、だからどうしたって話。
残念ながら、今の俺にはとりあえずここまでが限界。
リストは値とリストを組み合わせた物がリスト、ということにとどめておくよ。
おそらくスクリプト書くようになったらループ処理とかで色々ゴニョゴニョするんだと思う。
現にリストの特定のインデックスを引っ張ってくる関数とかって無いらしので、リストの特定のインデックスから値を引っ張る関数とか自作して公開してる人もいるみたいだし。
Amazonで買ったプログラミングelixirって本にも、
elixirのリストからランダムな順番でアクセスするのはコストが高い
とも書いてあった。
どうでもいいけどこの本、読んでて超〜面白い。買ってよかった。
タプルを配列として使う
上記の様に、リストってのはいわゆるPHPなんかの配列として認識しちゃうと、2秒後に脳みそパニックになって耳から脳汁垂れ流してキムワイプ必須みたいになっちゃうけど、タプルが配列だって思えば、それで済む話だ。
タプルだったらelem/2があるんで、PHPやJavaScriptなんかのよくある言語でいう配列とかは、elixirではタプルなんだなって、なんとなく分かってきた。
1 2 3 4 5 |
iex> tpl = {:ok, "ogaaaan", 43} {:ok, "ogaaaan", 43} iex> elem tpl, 1 "ogaaaan" |
夜も安心。