社内Erlang勉強会第2回目

に参加してきた。

プログラミングErlangの第二章をすすめた。

以下、メモ

  • Erlangは36進数までつかえる(何につかうん?)
  • タプルのパターンマッチめんどくさー

で、やっている途中にリストの末尾に追加できないかなーという質問がでてきていろいろいじっていたら、案外面白いつくりになっているなぁと思った。

リストをつくる構築子として [elem|List] みたいに作るんだけど、これを[elem|elem]のようにやるとどうなるかというと、

1> [1|[3]].
[1,3]
2> [1|3].
[1|3]

こんなかんじになります。Listの部分に要素を指定した形を本では不正なリストとして書かれていたんですが、これって Lispでいうところのドット対みたいですね。パターンマッチでも要素がとれますし。

10> [H|T] = [1,3].
[1,3]
11> H.
1
12> T.
[3]
13> f().
ok
14> [H|T] = [1|3].
[1|3]
15> H.            
1
16> T.            
3

欄外にLispプログラマへとして、HはcarでTはcdrでconsセルって書いてあったんですが、本当にそうみたいですね。(欄外に別のところだけど、単一代入について、単一化ですっていっているけど、なんか違う気がするんだけどなー。左辺が定数or定義済み変数、右辺が未定義変数だとエラー吐くし。)

で、キモイのがリスト連結の++演算子。これ第一引数にリスト、第二引数に要素を指定するとドット対を形成してくれるんですが、逆だとエラーになるんですよね。

17> [1] ++ 3.
[1|3]
18> 3 ++ [1].
** exception error: bad argument
     in operator  ++/2
        called as 3 ++ [1]

まぁ、落ち着いて、consセルとか考えると、++は第一引数のcdr部が指すポインタを第二引数を指すようにしているだけだから、こうなるのかってわかるんですが。ぱっとやったときにアレって感じてしまいました。

というわけで、何故かerlang勉強会なのに、consセルを使ってリストを説明していたというアレな勉強会でしたが、みなさまお疲れ様でした。