本買った

 cf. 20 次にどこへ行こう – Where to go next – Elixir

さて、今年ももうすぐ終わりだ。
12月の初めから1月弱をかけて Elixir のチュートリアル(GETTING STARTED)をやってきたわけだけども、Ruby 風の文法の中に Haskell のようなパターンマッチングがあったりと結構面白い言語だと思った。特にパイプ演算子(|>)で関数を数珠つなぎにしてデータを流していくところなんか、Haskell にもなく、新鮮に感じた。

というわけで、本を買った。来年はこれをやるぞ!

[amazonjs asin=”4274219151″ locale=”JP” title=”プログラミングElixir”]

シギル

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 のシジルと同じスペルなんだけど、どっちの発音が正しい(というか原語に近い)んだろうか。