Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Elixirとパターンマッチ
Search
Hiroaki Osawa
September 28, 2019
Programming
520
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Elixirとパターンマッチ
Hiroaki Osawa
September 28, 2019
More Decks by Hiroaki Osawa
See All by Hiroaki Osawa
健康保険証がなくなるらしい!?
qwyng
0
1k
My Gems for AtCoder
qwyng
0
80
Benefits of contributing to OSS
qwyng
0
520
Rustちょっと触ってみた
qwyng
1
300
Other Decks in Programming
See All in Programming
ふつうのFeature Flag実践入門
irof
8
4.2k
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
610
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.8k
Oxlintのカスタムルールの現況
syumai
6
1.1k
dRuby over BLE
makicamel
2
390
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
360
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
200
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
280
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
180
OSもどきOS
arkw
0
590
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.5k
はてなアカウント基盤 State of the Union
cockscomb
0
640
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Mobile First: as difficult as doing things right
swwweet
225
10k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
360
Designing Experiences People Love
moore
143
24k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
210
Ruling the World: When Life Gets Gamed
codingconduct
0
260
A Tale of Four Properties
chriscoyier
163
24k
How STYLIGHT went responsive
nonsquared
100
6.2k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
170
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
590
Transcript
Elixir とパターンマッチ Created by Hiroaki Osawa(@QWYNG)
Hiroaki Osawa Twitter @qwyngg GitHub https://github.com/QWYNG ブログ https://sasa5740.hatenablog.com Ruby とか
Rails とか
None
Elixir の特徴 Erlang の仮想マシン上で実⾏される 関数型⾔語 変数がイミュータブル Ruby の⽂法の⽪を被った Erlang といわれている。
シンプルな⽂法で⾒やすい IO.puts "Hello World!" -module(hello). -export([main/0]). main() -> io:format("Hello World!\n").
Elixir の根幹、パターンマッチ
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
= の別の⾒⽅ ⽅程式 x = a + 1 において x
に a + 1 を代⼊する意味ではない。 x と a + 1 は等しいとしているだけ
= の別の⾒⽅ ⽅程式 x = a + 1 において x
に a + 1 を代⼊する意味ではない。 x と a + 1 は等しいとしているだけ って Erlang 作者の Joe Armstrong さんがいっていたそうです
再代⼊はできません iex(1)> i = 42 42 iex(2)> i = 99
99 ⼀⾒できているように⾒えるが…
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 変数の参照先が変わっている
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 の参照先は変えない
関数でのパターンマッチ 1からnまでの整数の合計を出す関数 defmodule Inject do def sum(0), do: 0 def
sum(n), do: n + sum(n - 1) end Inject.sum(3) >6
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) # ◯ ここにあるブロックを実⾏! という処理が⾏われているイメージ
まとめ Elixir の根幹は= は代⼊ではないこと 関数でも条件でもこの考え⽅は⼀緒 プログラミングを最初に覚えたときには= の認識が変わったが、 Elixir は理解にはまたそれを忘れる必要がある
参考 プログラミング Elixir ( DaveThomas ( 著), 笹⽥耕⼀ ( 翻訳),
⿃井雪 ( 翻訳)) とんでもない神本です。プロを⽬指すための Ruby ⼊⾨とメタプログ ラミング Ruby の中間くらいの内容で、Elixir を完全理解できます 変数の再定義の解説は@cedretaber さんの Qiita 記事をリスペクトし ました https://qiita.com/cedretaber/items/4a7b3572acaeafe070e2
最後に宣伝 Ruby の Gem をいくつか公開しているのでぜひ使ってみてください pry-singular https://github.com/QWYNG/pry-singular クラスメソッドを Pry のコマンドにできる
Gem D4C https://github.com/QWYNG/d4c rails console にオプションを⾜せるようになる Gem