Elixir Sigils
概要
Elixir の Sigils について。
Sigil: 印, 印鑑, 魔力を持つしるし.
Elixir の文字列表現には、ダブルクォートやシングルクォートの文字リスト表現などがありますが、
もう一つの表現方法として Sigils があります。
Elixir のゴールの一つは ドメインに特化した記述が柔軟にできるような拡張性を持つことです。
※Rubyに詳しい方は %記法 の文法に近い話だと思えばいいです
Siglis
基本的な文法は、チルダ+1文字+セパレータです。
例えば、正規表現は チルダ+r+セパレータです。
iex> hogex = ~r/h.ge/
~r/h.ge/
iex> "hoge" =~ hogex
true
iex> "hige" =~ hogex
true
iex> "hage" =~ hogex
true
iex> "hagee" =~ hogex
true
iex> "hag" =~ hogex
false
セパレータは、他の言語の正規表現で一般的であるスラッシュを利用しているが、
全部で8種類の記述方法がある。
~r/h.ge/
~r|h.ge|
~r"h.ge"
~r'h.ge'
~r(h.ge)
~r[h.ge]
~r{h.ge}
~r<h.ge>
文字列(ダブルクォート代替)
~s / ~S でダブルクォートを代替します。
小文字はエスケープ・変数展開可、大文字はエスケープ・変数展開不可。
iex> var = "@@@"
"@@@"
iex> ~s(hoge hige hage) |> String.upcase
"HOGE HIGE HAGE"
iex> ~s(hoge hige hage #{var}) |> String.upcase
"HOGE HIGE HAGE @@@"
iex> ~S(hoge hige hage #{var}) |> String.upcase
"HOGE HIGE HAGE \#{VAR}"
文字列(シングルクォート代替)
~c / ~C でシングルクォートを代替します。
小文字はエスケープ・変数展開可、大文字はエスケープ・変数展開不可。
iex> var = "@@@"
"@@@"
iex> ~c(hoge hige hage) |> Enum.take(6)
'hoge h'
iex> ~c(#{var} hoge hige hage) |> Enum.take(6)
'@@@ ho
iex> ~C(#{var} hoge hige hage) |> Enum.take(6)
'\#{var}'
文字列配列
~w で文字列配列を代替します。
小文字はエスケープ・変数展開可、大文字はエスケープ・変数展開不可。
modifier として
s : ダブルクォート
c : シングルクォート
a : Atom
がある。
デフォルトはダブルクォーオトです。
modifier の大文字小文字については既出のルールと同じ
iex>
iex> ~w(hoge hige hage) |> Enum.take(2)
["hoge", "hige"]
iex> ~w(hoge hige hage)s |> Enum.take(2)
["hoge", "hige"]
iex> ~w(hoge hige hage)s |> Enum.take(2)
["hoge", "hige"]
iex> ~w(hoge hige hage)c |> Enum.take(2)
['hoge', 'hige']
iex> ~w(hoge hige hage)a |> Enum.take(2)
[:hoge, :hige]
ヒアドキュメント
iex> var = "@@@"
"@@@"
iex> ~s"""
...> line1
...> #{var}
...> line3
...> """
"line1\n@@@\nline3\n"
iex> var = "@@@"
"@@@"
iex> ~S"""
...> line1
...> #{var}
...> line3
...> """
"line1\n\#{var}\nline3\n"
iex> var = "@@@"
"@@@"
iex> chars = ~c"""
...> line1
...> #{var}
...> line3
...> """
'line1\n@@@\nline3\n'
iex> chars |> Enum.take(10)
'line1\n@@@\n'
カスタム Sigil
- sigil_r
Sigil を呼び出すのと同等のことができます
iex> regexp = sigil_r(<<"h.ge">>, 'i')
~r/h.ge/i
iex> "hoge"=~regexp
true
iex> "hge"=~regexp
false
- custom sigit
iex> defmodule UpDownSigils do
...> def sigil_u(string, []), do: String.upcase(string)
...> def sigil_d(string, []), do: String.downcase(string)
...> end
{:module, UpDownSigils,
<<70, 79, 82, 49, 0, 0, 5, 152, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 213, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 2, 104, 2, ...>>,
{:sigil_d, 2}}
iex> import UpDownSigils
nil
iex> ~u(hOgE)
"HOGE"
iex> ~d(hOgE)
"hoge"
参照
http://elixir-lang.org/docs/stable/elixir/Regex.html
http://elixir-lang.org/getting_started/19.html