読者です 読者をやめる 読者になる 読者になる

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> 

文字列もリストだしヘッドとテールに分解できるよね。という確認。

疑問点

第2章をざっと流して疑問に思ったことをいくつか。

  • リスト同士を単純に結合するには?
  • リストの末尾に要素を加えたい場合は?
  • リストの要素を始点と終点を指定して別のリストに切り出す方法は?
  • Latin-1以外の文字コードを扱うには?

リストの操作について、スライスで柔軟に値を取り出せるPythonは便利なんだな、というのを再認識。