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
0
470
Elixirとパターンマッチ
Hiroaki Osawa
September 28, 2019
Tweet
Share
More Decks by Hiroaki Osawa
See All by Hiroaki Osawa
健康保険証がなくなるらしい!?
qwyng
0
720
My Gems for AtCoder
qwyng
0
63
Benefits of contributing to OSS
qwyng
0
480
Rustちょっと触ってみた
qwyng
1
260
Other Decks in Programming
See All in Programming
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
0
220
知って得する@cloudflare_vite-pluginのあれこれ
chimame
1
130
ご注文の差分はこちらですか? 〜 AWS CDK のいろいろな差分検出と安全なデプロイ
konokenj
4
720
可変性を制する設計: 構造と振る舞いから考える概念モデリングとその実装
a_suenami
8
1.1k
バイブコーディングの正体——AIエージェントはソフトウェア開発を変えるか?
stakaya
3
240
Vibe Codingの幻想を超えて-生成AIを現場で使えるようにするまでの泥臭い話.ai
fumiyakume
20
9.7k
はじめてのWeb API体験 ー 飲食店検索アプリを作ろうー
akinko_0915
0
180
Workers を定期実行する方法は一つじゃない
rokuosan
0
130
階層化自動テストで開発に機動力を
ickx
1
450
Quality Gates in the Age of Agentic Coding
helmedeiros
PRO
1
110
TypeScriptでDXを上げろ! Hono編
yusukebe
3
890
React は次の10年を生き残れるか:3つのトレンドから考える
oukayuka
41
16k
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
Faster Mobile Websites
deanohume
308
31k
The Cost Of JavaScript in 2023
addyosmani
51
8.7k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
47
9.6k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
A Tale of Four Properties
chriscoyier
160
23k
Music & Morning Musume
bryan
46
6.7k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
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