Part21:シギル

海未「では、Elixirの基本文法の締めくくりとして、シギルについて見てみましょう」
希「ウチのスピリチュアルパワーをもってしても、いまいちよくわからん言葉なんやけど」
凜「希ちゃん、あれはもうやめるにゃ」

海未「Elixirという言語は、開発者が拡張できるように設計されています。その詳細はまだ先ですが、シギルはそのための機能の一つです」
希「今までやってきたような文法を、増やしたり変えたりできるん?」
海未「そうです。今回扱うシギルは、リテラルの定義方法に関わる部分ですね」
凜「文字列とかリストとかかな?」
海未「はい。例えば・・・」

~s(にっこにっこにー☆)    # "にっこにっこにー☆"
~c(ハラショー)            # 'ハラショー'
~w(うみ りん のぞ)        # ["うみ", "りん", "のぞ"]

海未「上からそれぞれ、文字列、文字リスト、リストの別の書き方です」
凜「このsとかcとかwとかを別のに変えると書き方を増やせるってこと?」
うみ「そうですね。例えば、自分で定義した構造体を表現する書き方を用意できたりするわけです」

defmodule Idol do
  defstruct name: ""
end

defmodule IdolSigil do
  require Idol
  def sigil_i string, [] do
    %Idol{name: string}
  end
end

defmodule Main do
  require Idol
  import IdolSigil
  def main do
    IO.inspect ~i(Umi Sonoda)    # %Idol{name: "Umi Sonoda"}
  end
end

Main.main

凜「ほえ~」
希「なるほどなあ。構造体を組み込み型みたいに書けるようになるってことか」
海未「sigil_iという名前がポイントです。sigil_というプレフィックスがつくと、それはシギルと見なされます」

海未「同じ文字列でも、~s~Sでは挙動が変わります」

name = "凜ちゃん"
~s(みんなのアイドル、#{name)だよー)  # "みんなのアイドル、凜ちゃんだよー"
~S(みんなのアイドル、#{name)だよー)  # "みんなのアイドル、\#{name}だよー"

海未「このように、大文字にすると変数展開が無効になります。エスケープシーケンスも使えないようですね」
凜「記号とか混ざった文字列書くときに便利そうだにゃ」
希「シンタックスハイライトがついてこれてないね・・・」

海未「ヒアドキュメントといって、文字列中に改行を入れる書き方もできます」

IO.puts ~s"""
小鳥の翼がついに大きくなって
旅立ちの日だよ
遠くへと広がる海の色暖かく
"""
小鳥の翼がついに大きくなって
旅立ちの日だよ
遠くへと広がる海の色暖かく

希「長文扱うときに便利そうやね」

海未「最後に、モディファイアというものがあります。シギルの動作を制御するためのもので、例えば」

~w(umi rin nozomi)a      # [:umi, :rin, :nozomi]
~w(umi rin nozomi)c      # ['umi', 'rin', 'nozomi']

海未「この末尾のaやcがモディファイアです。この場合は、要素の型の指定ですね」
希「aつけるとアトムで、cつけると文字リストになるんやね」
海未「シギルの種類ごとに使えるモディファイアが決まっています。全部は紹介しませんが、公式のドキュメントなど調べてみるといいでしょう」

海未「これで、Elixirの文法については一通りだと思いますが・・・」
凜「はいはーい!次回は凜がやるにゃ!」
海未「何かテーマがあるのですか?」
凜「Mixっていうツールがあるんだよ。使うと手を抜け、えっと、効率よくなりそうだから、調べてくるにゃ」
海未「・・・」
希「怠惰はプログラマの美徳やで」


LINEで送る
Pocket