Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elixirとパターンマッチ

Hiroaki Osawa
September 28, 2019

 Elixirとパターンマッチ

Hiroaki Osawa

September 28, 2019
Tweet

More Decks by Hiroaki Osawa

Other Decks in Programming

Transcript

  1. Elixir の特徴 Erlang の仮想マシン上で実⾏される 関数型⾔語 変数がイミュータブル Ruby の⽂法の⽪を被った Erlang といわれている。

    シンプルな⽂法で⾒やすい IO.puts "Hello World!" -module(hello). -export([main/0]). main() -> io:format("Hello World!\n").
  2. Elixir の = はパターンマッチ iex(1)> a = 1 # 左辺が変数なら値を束縛します

    >1 iex(2)> a + 3 >4 iex(3)> 1 = a # 代⼊ではない、 1 = 1 は真 > 1 iex(4)> 2 = a # 2 = 1 は偽ですね ** (MatchError) no match of right hand side value: 1
  3. = の別の⾒⽅ ⽅程式 x = a + 1 において x

    に a + 1 を代⼊する意味ではない。 x と a + 1 は等しいとしているだけ
  4. = の別の⾒⽅ ⽅程式 x = a + 1 において x

    に a + 1 を代⼊する意味ではない。 x と a + 1 は等しいとしているだけ って Erlang 作者の Joe Armstrong さんがいっていたそうです
  5. 再代⼊はできません iex(1)> i = 42 42 iex(2)> i = 99

    99 ⼀⾒できているように⾒えるが…
  6. In Ruby irb(main):001:0> i = 42 => 42 irb(main):002:0> f

    = -> { i } => #<Proc:0x00007fded21ce108@(irb):2 (lambda)> irb(main):003:0> f.call => 42 irb(main):004:0> i = 99 => 99 irb(main):005:0> f.call => 99 変数の参照先が変わっている
  7. In Elixir iex(1)> i = 42 42 iex(2)> f =

    fn -> i end # 無名関数 #Function<21.91303403/0 in :erl_eval.expr/5> iex(3)> f.() # 無名関数の呼び出し 42 iex(4)> i = 99 # ここでやっているのは変数のシャドウイング 99 iex(5)> f.() 42 同じ名前の別の変数扱い 元の i の参照先は変えない
  8. defmodule Inject do def sum(0), do: 0 # 引数が0 の時は0

    を返す def sum(n), do: n + sum(n - 1) #0 以外ならn + sum(n - 1) を返して再帰 end sum/1 #Elixir での関数の表し⽅、名前と引数の数が⼀緒なら⼀つの関数 この関数が引数を与えられると sum(0 = 3) # ✖ sum(n = 3) # ◯ ここにあるブロックを実⾏! という処理が⾏われているイメージ
  9. 参考 プログラミング Elixir ( DaveThomas ( 著), 笹⽥耕⼀ ( 翻訳),

    ⿃井雪 ( 翻訳)) とんでもない神本です。プロを⽬指すための Ruby ⼊⾨とメタプログ ラミング Ruby の中間くらいの内容で、Elixir を完全理解できます 変数の再定義の解説は@cedretaber さんの Qiita 記事をリスペクトし ました https://qiita.com/cedretaber/items/4a7b3572acaeafe070e2