ErlangのEshellで遊んでみた - 第2章の続き
先日のエントリはプログラミングErlang(飛行機本って言えばいいのかな?)の第2章の途中まで試してみたので、続きをやる。
まずはタプル。
タプル
2> P = {point, 12, 23}. {point,12,23} 3> P. {point,12,23} 4> Person = {person, 4> {name, joe}, 4> {height, 1.82}, 4> {footsize, 42}, 4> {eyecolour, brown} 4> }. {person,{name,joe}, {height,1.82}, {footsize,42}, {eyecolour,brown}} 5> Person. {person,{name,joe}, {height,1.82}, {footsize,42}, {eyecolour,brown}} 6> {_,{_,_},{_,_},{_,_},{_,Eyecolour}} = Person. {person,{name,joe}, {height,1.82}, {footsize,42}, {eyecolour,brown}} 7> Eyecolour. brown 8>
Pythonにもタプルはあるが、Erlangのタプルは中括弧で囲む。また、そのタプルが保持している値は何なのかをタプルの1要素目にアトムで表現するのが推奨されているらしい。
上記の例だと、3番目で座標を表す二つの数値を含むタプルを作っているが、先頭の要素に point というアトムを入れている。
6番目ではパターンマッチを用いてタプルの中身を取り出している。このやり方はPythonのシーケンスのアンパックとな似た感じなのですんなり理解できた。使わない値をアンダースコアに突っ込むというコードもどこかで見たことあったような。
リスト
続いてリスト
8> MyCats = [{chibi, 10},{kanta,8},{mikan,7}]. [{chibi,10},{kanta,8},{mikan,7}] 9> MyAllCats = [{hachi, 3},{sora, 2},{umi, 2}|MyCats] 9> . [{hachi,3},{sora,2},{umi,2},{chibi,10},{kanta,8},{mikan,7}] 10> [Cat1|CatList1] = MyAllCats. [{hachi,3},{sora,2},{umi,2},{chibi,10},{kanta,8},{mikan,7}] 11> Cat1. {hachi,3} 12> CatList1. [{sora,2},{umi,2},{chibi,10},{kanta,8},{mikan,7}] 13> [Cat2, Cat3|CatList2] = CatList1. [{sora,2},{umi,2},{chibi,10},{kanta,8},{mikan,7}] 14> Cat2. {sora,2} 15> Cat3. {umi,2} 16> CatList2. [{chibi,10},{kanta,8},{mikan,7}] 17>
他の言語に明るくないので正しくないかもしれないけど、ヘッドとテールという概念を言語機能として持つのは独特だなあという印象。
飛行機本にはLISPプログラマに対してCARだのCDRだのCONSだのといった用語で説明する注釈があったので、関数型の言語では一般的な概念なのかな?
ちなみに、タプルに入れてある値はうちのネコ達から。
文字列
24> Hoge = "Fuga". "Fuga" 25> [1,2,3]. [1,2,3] 26> [83,117,112,114,105,115,101]. "Suprise" 27> [1,83,117,112,114,105,115,101]. [1,83,117,112,114,105,115,101] 28> "あーらん!". [12354,12540,12425,12435,65281] 29> [12354,12540,12425,12435,65281]. [12354,12540,12425,12435,65281] 30>
文字列はダブルクォートで囲む。シングルクォートで囲むとアトムになってしまう。文字列の実態は整数のリストで、リストのすべての要素が文字列として評価できる数値の場合、そのリストを評価すると文字列として扱われるようだ。26番目はすべての要素が表示可能な文字に該当する数値なので評価すると文字列になっているが、27番目は先頭の1が文字に該当しない。
日本語を評価したらエラーになるかなと思ったけど、予想外なことに数値のリストになった。どういうことだろう?返ってきたリストを評価しても文字列にはならなかった。これは入力した"あーらん!"はLatin-1以外のエンコード(UTF-8かな?)で入力されて、エンコーディングで扱う範囲を超えているので文字列としては扱えないってことだろうけど。
逆に扱えないのに何で数値には変換出来るのだろう?
パターンマッチ
31> [H|T] = "hogefuga". "hogefuga" 32> H. 104 33> T. "ogefuga" 34>
文字列もリストだしヘッドとテールに分解できるよね。という確認。