Monday, June 23, 2014

LINCXの前に

LINCXの前に

Erlang

LINCXが記述されているErlangについて少し知っておくことにする,
関数型言語らしい…最近Haskellを少し齧ったなぁ.

OSX用のパッケージは以下のURLから入手できる.

https://www.erlang-solutions.com/downloads/download-erlang-otp

インストール後、この手の言語にはだいたいあるirbみたいのを探してみたところerlというのを発見.

yukaary$ which erl
/usr/local/bin/erl
yukaary$ erl
Erlang R16B01 (erts-5.10.2) [source-bdf5300] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V5.10.2  (abort with ^G)
1> 

よしよし. さっそく使っていこう. IBMのサイトの簡単なイントロ(https://www.ibm.com/developerworks/jp/opensource/library/os-erlang1/)を参考に色々試してみる.

  1. 一行の終わりは「.」で区切る.
  2. 指数を利用できる. 10.9E-2., 10.11E5.
  3. アトム. 静的リテラルまたは定数. 有効な演算は比較だけ
12> 1 == 1.
true
13> 0 == 1.
false
14> 1 == "1".
false
15> "1" == "1".
true
16> 1 == '1'.
false
17> yukaary == yukaary.
true
18> yukaary == 'yukaary'.
true
19> yukaary == "yukaary".
false
20> 'yukaary' == "yukaary".
false
21> "yukaary" == "yukaary".
true
22> 'y' > 'm'.
true
23> 'y' < 'm'.
false
24> y > m.
true
25> y > "m".
false

シングルクォーテーションとダブルクォーテーションの扱いを間違えると死ねそう.
* 文字列の場合
- シングルクォーテーションありと無しは同じ扱い
- ダブルクォーテーションありと無しは別もの扱い -> ストリング値、だそうな.
* 数値の場合
- シングル、ダブル クォーテーションともに別物扱い.

4. タプル

25> {yukaary, "yukaary craft", 2014, "yukaary.craft@gmail.com"}.
{yukaary,"yukaary craft",2014,"yukaary.craft@gmail.com"}
26> element(2, {yukaary, "yukaary craft", 2014, "yukaary.craft@gmail.com"}).
"yukaary craft"
27> element(10, {yukaary, "yukaary craft", 2014, "yukaary.craft@gmail.com"}).
** exception error: bad argument
     in function  element/2
        called as element(10,
                          {yukaary,"yukaary craft",2014,
                                   "yukaary.craft@gmail.com"})
28> element(1, element(5, {yukaary, "yukaary craft", 2014, "yukaary.craft@gmail.com", {friend, "makimaki", "zunchan"}})).
friend

ほうほう…やっぱり基本的なところはhaskellと変わらない.

31> {yukaary, maki} == {yukaary, maki}.
true
32> {yukaary, maki} == {"yukaary", maki}.
false
33> {'yukaary', maki} == {"yukaary", maki}.
false
34> {'yukaary', maki} == {'yukaary', maki}.
true

タプルの比較は先頭要素から順に適用される.

5. リスト

60> [1,2,3,4,5].
[1,2,3,4,5]
61> [72,101,108,108,111].
"Hello"
62> [72,73,74,75,76].    
"HIJKL"
63> [$Y,$u,$k,$a,$a,$r,$y].
"Yukaary"

えええ?文字列はリスト扱いらしいけど、数字のリストの結果が文字列に変換されるのはどうなの.

リストの結合

「++」を使う.

23> "yukaary" ++ "makimaki".
"yukaarymakimaki"

リストからの要素除去

「–」を使う.

1文字ずつ先頭から合致したものを除去していくみたい. 下の例だと「 」(空白)2つを除去するために” “を引いてやる必要がある. 間にxを入れても同じ結果ということは順序はどうでもよさげ.

45> Voiceroids -- " ".   
"yukarimaki zunko"
46> Voiceroids -- "   ".
"yukarimakizunko"
47> Voiceroids -- " x  ".
"yukarimakizunko"

束縛変数

束縛変数なるものを定義できる. 一度値を設定したら2度と更新できないみたいなので変…数?という感じだけど.

36> Yukari = "Yukari Yuzuki".
"Yukari Yuzuki"
37> Maki = "Maki Tsurumaki".
"Maki Tsurumaki"
38> Zun = "Zunko Touhoku".
"Zunko Touhoku"
39> b().
Maki = "Maki Tsurumaki"
Yukari = "Yukari Yuzuki"
Zun = "Zunko Touhoku"
ok
  • b(). 現在の束縛変数をリストアップ.
  • f(). 束縛変数を解放.

一度変数を定義すると型が確定するので以降その変数を用いた計算に制限ができる.

2> Value = 100.
100
3> Total = Value + 8.
108
4> Total = Value + "8".
** exception error: an error occurred when evaluating an arithmetic expression
     in operator  +/2
        called as 100 + "8"

タプルと変数を用いて、タプルから特定の要素を引き出せる.

5> {contact, Name, Email} = {contact, "Yukaary", "yukaary.craft@gmail.com"}.
{contact,"Yukaary","yukaary.craft@gmail.com"}
6> Name.
"Yukaary"
7> Email.
"yukaary.craft@gmail.com"

最初のcontactはマッチング用.

リストでも同様の処理を適用できる.

18> [A,B|C] = [yukaary, maki, zunko, futago].
[yukaary,maki,zunko,futago]
19> A.                                       
yukaary
20> B.
maki
21> C.
[zunko,futago]

変数は一度限りしか代入できないから、プログラミングとしては一度限りの変数(または極力変数を使わずに)を駆使しながら処理を記述していけばいいのかな.

アトムとストリング

  • アトムは原子的という意味合いからそれ以上分割できない.
  • ストリングは中身はリストだから分割したりする余地がある.
66> [H|T] = "yukaary".
"yukaary"
67> H.
121
68> [121].
"y"
69> T.
"ukaary"

今度は「y」が対応する数値になったでござる.

1> [H|T] = [yukaaary, makimaki, zundaa].
[yukaaary,makimaki,zundaa]
2> H.
yukaaary
3> f().
ok
4> [H|T] = 'yukaary'.                   
** exception error: no match of right hand side value yukaary
5> [H|T] = yukaary.  
** exception error: no match of right hand side value yukaary
6> [H|T] = ["yukaary"|"makimaki"].
["yukaary",109,97,107,105,109,97,107,105]
7> H.                             
"yukaary"
8> [H2|T2] = H.
"yukaary"
9> H2.
121

atomは分割できないので例外が発生する.
文字列同士を「|」で結合させたら入れ子のリストが出来ることが判明.

No comments:

Post a Comment