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

Elixirとパターンマッチ

Avatar for Hiroaki Osawa Hiroaki Osawa
September 28, 2019

 Elixirとパターンマッチ

Avatar for Hiroaki Osawa

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