ElixirSchoolの勉強メモです。
シギルの概要
Elixirには文字リテラルを表現したり取り扱うための別の構文がある。
シギルはチルダ~
から始まり、文字が一つそれに続く。
Elixirのコアには予め組み込まれたシギルがあるが、それだけではなく言語を拡張したい場合には独自のシギルを作ることもできる。
-
~C
エスケープや埋め込みを含まない 文字のリストを生成する -
~c
エスケープや埋め込みを含む 文字のリストを生成する -
~R
エスケープや埋め込みを含まない 正規表現を生成する -
~r
エスケープや埋め込みを含む 正規表現を生成する -
~S
エスケープや埋め込みを含む 文字列を生成する -
~s
エスケープや埋め込みを含む 文字列を生成する -
~W
エスケープや埋め込みを含まない 単語のリストを生成する -
~w
エスケープや埋め込みを含む 単語のリストを生成する -
~N
NaiveDataTime
構造体を生成する
デリミタのリストには以下のものが含まれる。
-
<...>
カギ括弧のペア -
{...}
中括弧のペア -
[...]
大括弧のペア -
(...)
小括弧のペア -
[...]
パイプ記号のペア -
/.../
スラッシュのペア -
"..."
ダブルクォートのペア -
''...
シングルクォートのペア
文字のリスト
iex(1)> ~c/2 + 7 = #{2 + 7}/
'2 + 7 = 9'
iex(2)> ~C/2 + 7 = #{2 + 7}/
'2 + 7 = \#{2 + 7}'
正規表現
正規表現は動的にもRegex
関数内で使うためにも生成できる。
iex(3)> re = ~r/elixir/
~r/elixir/
iex(4)> "Elixir" =~ re
false
iex(5)> "elixir" =~ re
true
大文字で始まる文字列は正規表現と一致しない。
ElixirはPerl Compatible Regular Expressions(Perl互換正規表現式、PCRE)をサポートしているので、シギルの末尾にi
を追加することで大文字・小文字の区別をしないように指定できる。
iex(7)> re = ~r/elixir/i
~r/elixir/i
iex(8)> "Elixir" =~ re
true
iex(9)> "elixir" =~ re
true
さらにElixirはErlangの正規表現ライブラリを元に作られたRegex APIを提供している。
iex(11)> string = "100_000_000"
"100_000_000"
iex(12)> Regex.split(~r/_/, string)
["100", "000", "000"]
Regex.split
はリストを返す。
文字列
iex(15)> ~s/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir school"
iex(16)> ~S/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir \#{String.downcase \"SCHOOL\"}"
単語のリスト
iex(17)> ~w/i love #{'e'}lixir school/
["i", "love", "elixir", "school"]
iex(18)> ~W/i love #{'e'}lixir school/
["i", "love", "\#{'e'}lixir", "school"]
NaiveDataTime
NaiveDataTimeはタイムゾーンがないDateTime
を表現する構造体を手早く作るときに有用。
ほとんどの場合、NativeDateTime構造を直接作ることは避けるべきですが、パターンマッチには有用。
NaiveDateTime.from_iso8601("2015-01-23 23:50:07") == {:ok, ~N[2015-01-23 23:50:07]}
シギルを作る
Elixirのゴールの一つは拡張性のあるプログラミング言語になること。
iex(20)> defmodule MySigils do
...(20)> def sigil_u(string, []), do: String.upcase(string)
...(20)> end
{:module, MySigils,
<<70, 79, 82, 49, 0, 0, 5, 132, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 195,
0, 0, 0, 19, 15, 69, 108, 105, 120, 105, 114, 46, 77, 121, 83, 105, 103, 105,
108, 115, 8, 95, 95, 105, 110, 102, 111, ...>>, {:sigil_u, 2}}
iex(23)> import MySigils
MySigils
iex(24)> ~u/elixir school/
"ELIXIR SCHOOL"
シギルの関数定義には入力とリストの2つのリストが必要。