Skip to content

Instantly share code, notes, and snippets.

@fujimisakari
Last active April 18, 2017 16:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fujimisakari/b023d4a6f9c2e47ccf911098579971e0 to your computer and use it in GitHub Desktop.
Save fujimisakari/b023d4a6f9c2e47ccf911098579971e0 to your computer and use it in GitHub Desktop.

プログラミングErlang - 基本1

2章〜3章あたり。
基本的なシンタックスの種類やルールなど

変数

  • 変数名は大文字でなければならない
  • 単一代入変数なので、一度しか値を代入できない
  • 変数のスコープは、変数が定義されている構文単位になる
    • 例えば、Xが関数の1つの節の中で使われている場合、その値は節の外には漏れない
    • グローバル変数やローカル変数といったものはない
  • 変数とは値への参照でしかない
  • 「_」は無名変数と呼ばれ通常の変数とは異なり、何度使っても束縛されない
  • f()は現在存在する束縛状態をすべて忘れるようにシェルを指示する。

アトム

  • 数値以外のさまざまな不変値を表すのに使う
  • グローバルで有効
  • 小文字で始まり、英数字、_, @ が使える
  • ''で囲んで示すこともでき、利用すれば大文字始まり英数以外を含むアトムを作れる
1> hello.
hello

タプル

  • ある個数の項目を1つにまとめたいときに使う
  • 各フィールドには、名前がなく整数のペアを持つだけ
  • タプルが何に使われているかを表現するためにアトムを最初に入れることが多い
1> P = {point, 10, 45}.
{point,10,45}
2> Person = {person,
2>               {name, joe},
2>               {height, 1.82},
2>               {footsize, 42},
2>               {eyecolour, brown}}.
{person,{name,joe},
        {height,1.82},
        {footsize,42},
        {eyecolour,brown}}
%% 値の取り出し
3> {point, X, Y} = P.
{point,10,45}
4> X.
10
5> Y.
45
6> {_, {_, Who}, _, _, _} = Person.
{person,{name,joe},
        {height,1.82},
        {footsize,42},
        {eyecolour,brown}}
7> Who.
joe

リスト

  • 個数が決まってないものを格納するのにはリストを使う
  • リストの各要素の型はどんなものでも構わない
  • リストの先頭要素はヘッドという
  • リストのヘッドを取り除いたときに残る要素はテールという
  • リストのヘッドは非常に効率良くアクセスできるので、実質的にすべてのリスト処理関数において
    まずリストのヘッドを取り出し、それに何らかの処理をして、それからリストのテールを
    処理していくようになっている。
1> ThingsToBuy = [{apples,10},{pears,6},{milk,3}].
[{apples,10},{pears,6},{milk,3}]
2> [Buy1|ThingsToBuy1] = ThingsToBuy.
[{apples,10},{pears,6},{milk,3}]
3> Buy1.
{apples,10}
4> ThingsToBuy1.
[{pears,6},{milk,3}]

文字列

  • 厳密に言えば、Erlangには文字列は存在しない。文字列は実際には単なる整数リスト
  • リスト値を表示するとき、そのリストに含まれるすべての整数が表示可能な文字を表していればリストを文字列として表示
1> Name = "Surprize".
"Surprize"
2> [83,117,114,112,114,105,115,101].
"Surprise"

モジュール/関数

  • モジュール
    • コードの基本単位
    • どの関数も必ずモジュールに属している
    • モジュールは拡張子がerlのファイルを入れる
    • コンパイルしたモジュールの拡張子はbeamになる
    • それぞれの関数定義を節と呼ぶ
    • 節の最後は2パターンある
      • 最後の節の場合は「.」を使う
      • 最後の節でない場合は「;」を使う
    • exportは、モジュールの外で呼び出す必要がある関数を定義する
    • exportの「Name/N」という表記は、N個の引数を持つNameという関数を意味する
  • 関数
    • 関数名と引数で、ヘッドと言う
    • 関数内の一連の式を、ボディと言う
    • 関数引数の数をアリティと言う
    • 関数を呼び出したときの引数とヘッドのパターンが一致するとボディの式が評価される
    • パターンは関数定義に出てくる順に照合される
    • return文はない、ボディで評価されたものが戻り値となる

・geometry.erl

-module(geometry).
-export([area/1]).

area({rectangle, Width, Ht}) -> Width * Ht;
area({circle, R}) -> 3.14159 * R * R.

・Eshell

%% モジュール呼び出し
1> c(geometry).
{ok,geometry}
2> geometry:area({rectangle, 10, 5}).
50
3> geometry:area({circle, 1.4}).
6.15752

モジュールを組み合わせる

買い物リスト

・shop.erl

-module(shop).
-export([cost/1]).

cost(oranges) -> 5;
cost(newspaper) -> 8;
cost(apples) -> 2;
cost(pears) -> 9;
cost(milk) -> 7.

・show1.erl

-module(shop1).
-export([total/1]).

total([{What, N}|T]) -> shop:cost(What) * N + total(T);
total([]) -> 0.

・Eshell

1> Buy = [{oranges,4}, {newspaper,1}, {apples,10}, {pears,6}, {milk,3}].
[{oranges,4},{newspaper,1},{apples,10},{pears,6},{milk,3}]
2> shop1:total([]).
0
3> shop1:total(Buy).
123
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment