LoginSignup
14
1

More than 1 year has passed since last update.

今日のElixirSchoolメモ10「シギル」

Posted at

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つのリストが必要。

14
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
1