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/)を参考に色々試してみる.
- 一行の終わりは「.」で区切る.
- 指数を利用できる. 10.9E-2., 10.11E5.
- アトム. 静的リテラルまたは定数. 有効な演算は比較だけ
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