erlang リスト, 文字列
この時の冒頭の話ですが、「編集画面モード」からも出来る気がしてきた。
*数字*[タグ1][タグ2]タイトル
って書けば良いっぽい・・・でも数字はどうやって決めるのでしょう?(=w=
ま、1日1件だけにしておけって事で!
リスト
- 個数が決まっていないものを入れる
- []で囲む
1> MyClass = [{boys, 20}, {girls, 10}]. [{boys,20},{girls,10}]
- 要素は何型でもOK
2> X = [1, 2, 3, apple, '@', {name, hiroyuki}]. [1,2,3,apple,'@',{name,hiroyuki}]
- リストの先頭の事をヘッドと呼び、残りをテールと呼ぶ
- "|"をヘッドとテールの区切りとして使う
3> [Head | Tail] = MyClass. [{boys,20},{girls,10}] 4> Tail. [{girls,10}]
-
- 残り要素が1個でも、テールはリストとして取り出される
- "|"を使えば、リストへの追加もOK
5> Y = [99, 99, 99, MyClass | X]. [99,99,99, [{boys,20},{girls,10}], 1,2,3,apple,'@', {name,hiroyuki}]
-
- "|"を使う時はテールをリストにする
- テールがリスト出ない時は「不正な形式」と呼ばれる
- "|"を使う時はテールをリストにする
6> [1, 2| 3]. [1,2|3] 7> [A | B] = [1, 2| 3]. [1,2|3] 8> B. [2|3] 9> [C | D] = B. [2|3] 10> D. 3
-
-
-
- ライブラリ関数の大半は「不正な形式」を仮定していない
-
-
- リストの連結も可
11> Z = Y ++ X. [99,99,99, [{boys,20},{girls,10}], 1,2,3,apple,'@', {name,hiroyuki}, 1,2,3,apple,'@', {name,hiroyuki}]
- リストから取り除く
12> Z -- [apple, '@', '@']. [99,99,99, [{boys,20},{girls,10}], 1,2,3, {name,hiroyuki}, 1,2,3,apple, {name,hiroyuki}]
-
- 最初にあるものだけ取り除かれる
- 2個消したいモノは2個書く
- 最初にあるものだけ取り除かれる
- ここまでにも出てきていますが、取り出す場合は、タプルと同じような方法
13> [_, _, _, _, _, _, _, _, _, {_, Q}] = Y. [99,99,99, [{boys,20},{girls,10}], 1,2,3,apple,'@', {name,hiroyuki}] 14> Q. hiroyuki
無名変数が多いと見難い>_<。
文字列
- 厳密に言えばerlangにはない
- 文字列は整数のリスト
- ""で囲む
15> "Hello". "Hello" 16> [97, 98, 99, 100, 10, 8]. "abcd\n\b" 17> [97, 98, 99, 100, 10, 7]. [97,98,99,100,10,7]
-
- リストに含まれる値全ての整数がLatin-1(ISO-8859-1)の範囲で表示可能な文字である場合、リストを文字列として表示する
- 文字と整数の対応を調べるのは"$"
18> $A. 65 19> [65 + 32]. "a"
何も考えずにwindowsで日本語を入れてみた。(番外編2)
番外編1
- 全てを忘れたい
20> f(). ok 21> Z. * 1: variable 'Z' is unbound
人生で欲しいかも?
番外編2
1> "あ". [130,160] 2> "あい". [130,160,130,162] 3> "あい逃". [130,160,130,162,147,166] 4> $"あい逃". f() aae taetaetaetnaoetnaoi rrrr ^G Eshell V5.7.4 (abort with ^G) 1>
SJISのコードになるらしい
"$"をつけた後の無駄な改行や、f()や、変な文字列は、反応がなくなったので、適当に叩いた形跡です。
Erlang は文字列のエンコーディングについては、一切関知しません。そもそもErlang では文字列は整数のリストです。リストの中に好きなようにコードを並べてください、というスタンスのようです。
http://ancient.s6.xrea.com/erlang/erlang.pdf
そのためソースファイルの文字コードをSJIS、EUC、UTF-8 等にしておけば、それらの文字コードで文字列リテラルを書くことができます。
ま、勉強が進んだら調べよう。
erlang アトム, タプル
むむむ。。。編集機能を「その場編集モード」から「編集画面モード」に変えたのですが・・・カテゴリの入力の仕方と、1日に2件以上投稿する方法が分からないです。
最初は、何回も新規投稿しようとして、先程記述した記事の編集画面へと飛ばされて、ポカーンとしていました。
仕方ないので、諦めて「その場編集モード」からタイトルとカテゴリだけを入力して下書き保存をし、編集画面モードに入っています。
誰か助けてください(つдT)
で、では、気を取り直して!
アトム
- 数値以外のさまざまな不変値を表す
- 小文字で始まり、英数字、アンダースコア、アットマークと続く
- 大文字や、英数字以外から始めたい場合は''を使う
1> true. true 2> true_@. true_@ 3> +. * 1: syntax error before: '.' 3> '+'. '+' 4> 'Sunday'. 'Sunday'
C言語とかで、最初に書く#defineみたいなものですね。
#define INVALID -1 #define FALSE 0 #define TRUE 1 #define SUNDAY 0
つまり、前回書いた↓はアトムと整数のパターン照合をしていたのです。
2> x = 1. ** exception error: no match of right hand side value 1
エラーになるわけです。
# 一瞬、「0って偽だったっけ?」と考え込んでしまったのは秘密です。
タプル
- 項目を1つにまとめる時に使う
5> {2, 3, 4}. {2,3,4}
- タプルを表現するアトムを最初の要素に入れる事が多い
6> P = {point, 2, 3}. {point,2,3}
- 入れ子も可能
1> Name = {name, hiroyuki}. {name,hiroyuki} 2> Height = {height, 173}. {height,173} 3> Person = {person, Name, Height}. {person,{name,hiroyuki},{height,173}}
取り出す
4> {person, {name, N}, {height, H}} = Person. {person,{name,hiroyuki},{height,173}} 5> H. 173 6> {_, {_, _}, {_, X}} = Person. {person,{name,hiroyuki},{height,173}} 7> X. 173
- 取り出したい位置に未束縛変数を置いたパターンを記述する
- "_"は無名変数と呼ばれる
- 1つのパターンの中で何度も使う場合でも、同じ値に束縛されない
- つまり、興味がない変数の代わりとして使う
- 1つのパターンの中で何度も使う場合でも、同じ値に束縛されない
正直めんどくさい。
突然domUに繋がらなくなる
erlang インストール 〜 代入
普段は関数型言語から程遠い僕が、使った事もないerlangを今更勉強してみる企画。そしてその記録がココ。
1日坊主に終わらなかったら奇跡。
更新のペースが速くなる事はないと思います。
あと、Erlangと打つのが面倒なので、erlangと記述するのにはご容赦を。
なぜerlang?
- 並列処理が得意なんだって!
- これからはマルチスレッドが来るから関数型言語なんだって!
- プログラマなら複数の言語が出来ないとダメなんだって!
- 会社で使ってる言語だと自宅でやる気力が起きないよ!
- 上司の机にerlangの本があるよ!
明確にこれが使いたいという理由があったわけではないです。
別に新しい言語というわけでもないですし。
でもまぁ、入門してみましょう。
erlangの特徴
http://ja.wikipedia.org/wiki/Erlang
- エリクソン社製
- 関数型
- 単一代入
- 並列処理が得意
- 複数プロセスの生成は、OSのプロセスとスレッドとも異なる
- 軽量なスレッドで、Javaのグリーンスレッドに似ている
- ホットスワップ可能
- 基本的にはインタプリタ
- 一応コンパイラもある
プロセスの部分は調べないといけませんね。
でも、基本を抑えてから徐々に行く。
今更焦っても仕方ない。
ここで、大事なのは「並列処理が得意」と「単一代入」かな?
インストール
公式サイトのDownloadsから「Windows binary」の最新版を落とす。
あとは実行して、環境変数にErlangのbinフォルダへのpathを通して、コマンドプロンプトからお決まりをしてみる。
>erl Eshell V5.7.4 (abort with ^G) 1> io:fwrite("Hello World\n"). Hello World ok
特徴的に感じたところ
erlに入力してみた。
1> 111111111111111 * 2222222222222 * 3333333333333333. 823045267489628724279835391037119341563786 2> x = 1. ** exception error: no match of right hand side value 1 3> X = 2. 2 4> X = 3. ** exception error: no match of right hand side value 3 5> X = X + 1. ** exception error: no match of right hand side value 3 6> 6/2. 3.0
- 文の終わりはピリオド
- 整数演算は多倍長整数
- 整数演算では誤差がない
- 変数は大文字
- 変数へは単一代入
- 二度代入するとエラー
- 上記5番目は X1 = X + 1というように使った事のない変数に入れていく
- 二度代入するとエラー
- 変数に代入する事を束縛するという
- 代入済みの変数を束縛済み変数(bound variable)と呼ぶ
- "="はパターン照合処理を意味する
- 右辺を評価して、結果を左辺とパターン照合する
- 数学の"="に近いかも
- "/"は常に浮動少数を返す
と、今日はここまで。
早く並列処理まで行きたいな〜。。。
でも、基本からやらないと。