01
基礎
Hello World とモジュール
各 Erlang ファイルは -module(name) で宣言されるモジュールです。エクスポート関数は -export([name/arity]) で列出されます。arity(引数の数)は関数の同一性の一部です——greet/0 と greet/1 は別の関数です。シェルで c(Module) でコンパイルします。
erlang
% hello.erl
-module(hello).
-export([greet/1, greet/0]).
greet() ->
greet("World").
greet(Name) ->
io:format("Hello, ~s!~n", [Name]).
% Compile & run in the shell:
% c(hello).
% hello:greet("Alice"). %=> Hello, Alice!変数とアトム
変数は大文字(または _)で始まり、単一代入です——一度束縛されると変更できません。束縛済み変数への再マッチは実際にはアサーションです:X = X+1 は badmatch エラーを発生させます。アトムは小文字で始まる名前付き定数で、グローバルテーブルに格納され同一性で比較されます。
erlang
Name = "Alice". % variables start with uppercase
Age = 30. % bound once — single assignment!
% Age = 31. % ** exception error: no match of RHS
% Atoms start with lowercase (or are quoted)
ok. % the ok atom (common return value)
error. % another atom
'This is an atom'. % quoted atom with spaces
true, false, undefined % built-in atoms
% Pattern matching binds and asserts
{ok, Result} = {ok, 42}. % Result = 42
{error, _} = {error, badarg}. % _ matches and discardsタプルとレコード
タプルは {a,b,c} と書く固定サイズコンテナです。レコードは -record で宣言される名前付きフィールドを持つタプルです。レコードのフィールド更新は新しいレコードを作成します(不変データ)。最初の要素は慣習的にタグアトム(例: point や person)で、パターンマッチを明確にします。
erlang
% Tuples (fixed-size, positional)
Point = {point, 3, 4}.
{point, X, Y} = Point. % X=3, Y=4
element(2, Point). %=> point
% Records (syntactic sugar over tuples)
-record(person, {name, age, city = "Unknown"}).
P = #person{name = "Alice", age = 30}.
P#person.name. %=> "Alice"
P2 = P#person{age = 31}. % update field
{person, Name, Age, _} = P. % underlying tupleリストとリスト内包表記
リストは [Head|Tail] で構築される片方向リストです。++ は連結し(左側 O(n))、-- は要素を削除します。リスト内包表記 [Expr || 修飾子1, 修飾子2, ...] はジェネレータ(X <- List)とフィルタ(ブール式)をサポートします。
erlang