cf. 19 シギル(印) – Sigils – Elixir
シギルとは ~
+一文字から始まる文字表現によってデータを記述するものだ。Ruby の % 記法みたいなもの。
正規表現
最もよく使うのは正規表現だ。正規表現のシギルは ~r
で始まる。
iex(1)> re = ~r/foo|bar/
~r/foo|bar/
iex(2)> "foo" =~ re
true
iex(3)> "baz" =~ re
false
~r
の後にセパレータ(ここでは /
)が続いて、セパレータに挟まれた形で正規表現(の文字列)が来る。
セパレータ
上の例ではセパレータに /
を使ったけど、Elixir では全部で8つのセパレータをサポートしている。
内容に応じて使いやすいセパレータを使えばいい。
文字列、文字リスト、単語リスト
~s
シギルは文字列を生成する。
iex(4)> ~s(hello)
"hello"
~c
は文字リスト。
iex(5)> ~c(hello)
'hello'
そして ~w
は単語のリストを生成する。これは Ruby の %w
と同じだ。
iex(6)> ~w(foo bar baz)
["foo", "bar", "baz"]
カスタムシギル
Elixir の目標の一つに拡張性がある。シギルも拡張できる。どういうことかというと、標準では提供されていないシギルを自分で定義できるってこと。
初めに例を挙げた ~r は実際には sigil_r 関数の呼び出しになっている。
iex(7)> sigil_r(<<"foo">>, '')
~r/foo/
だから sigil_ナントカ
という関数を定義すればシギルを定義したことになる。例えば整数を返す ~i
を定義してみよう。
iex(8)> defmodule MySigils do
...(8)> def sigil_i(string, []), do: String.to_integer(string)
...(8)> end
{:module, MySigils,
<<70, 79, 82, 49, 0, 0, 5, 4, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 172,
131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115,
95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, {:sigil_i, 2}}
iex(9)> import MySigils
MySigils
iex(10)> ~i<42>
42
なるほど、期待した通りに動いている。
ところで sigil って、Perl のシジルと同じスペルなんだけど、どっちの発音が正しい(というか原語に近い)んだろうか。