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
A Tour of Elixir
Search
ponday
August 17, 2018
Programming
1
470
A Tour of Elixir
VEGA Tech Meetup #2(2018/08/17)発表資料です。
ponday
August 17, 2018
Tweet
Share
More Decks by ponday
See All by ponday
関数型でGoFのデザインパターンやってみる
honda
1
1.1k
TypeScriptの型表現
honda
10
2.9k
Web Componentsの今
honda
1
380
これまでのReact、これからのReact
honda
0
280
Gatsbyお試し
honda
0
110
styled-components or emotion?
honda
0
630
Web ComponentsとAngular
honda
0
130
Atomic Design周りについての私見
honda
1
620
え、まだWeb Componentsを未来の技術だと思ってるの?
honda
2
740
Other Decks in Programming
See All in Programming
CSC509 Lecture 13
javiergs
PRO
0
110
watsonx.ai Dojo #4 生成AIを使ったアプリ開発、応用編
oniak3ibm
PRO
1
140
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
1
300
Macとオーディオ再生 2024/11/02
yusukeito
0
370
Remix on Hono on Cloudflare Workers
yusukebe
1
300
Better Code Design in PHP
afilina
PRO
0
130
Hotwire or React? ~アフタートーク・本編に含めなかった話~ / Hotwire or React? after talk
harunatsujita
1
120
みんなでプロポーザルを書いてみた
yuriko1211
0
280
距離関数を極める! / SESSIONS 2024
gam0022
0
290
Jakarta EE meets AI
ivargrimstad
0
130
as(型アサーション)を書く前にできること
marokanatani
10
2.7k
Why Jakarta EE Matters to Spring - and Vice Versa
ivargrimstad
0
1.1k
Featured
See All Featured
A designer walks into a library…
pauljervisheath
204
24k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
130
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
GraphQLとの向き合い方2022年版
quramy
43
13k
Designing the Hi-DPI Web
ddemaree
280
34k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Happy Clients
brianwarren
98
6.7k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
100
Being A Developer After 40
akosma
87
590k
Practical Orchestrator
shlominoach
186
10k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Transcript
A Tour of Elixir VEGA Tech Meetup #2 / Aug
17th, 2018 ponday (@ponday_dev)
Profile - ponday (Honda, Yusuke) - 株式会社ベガコーポレーション エンジニア - Like
: TypeScript / Elixir / Python etc...
あらすじ Elixir採用に向けて技術検証中 新プロダクト作るぞ! Elixir試してみよう 負荷試験の成績がものすごい!! みんなもやろう! ← イマココ 前回Meetupより
今回は触ってみよう!編
・ 雰囲気を伝えるための超圧縮版です 詳しい内容は公式ドキュメントを参照願います ・ Elixirの機能を紹介するものでPhoenixの内容は 含みません ご注意
None
の前に
・ Prologライクな関数型言語 ・ 極めて高い信頼性(付属ライブラリ:99.9999999%) ・ 通信分野やゲームサーバでの採用実績 ・ Call of
Duty ・ League of Legends ・ WhatsApp Erlang
・ 軽量プロセス ・ 極めて小さなメモリ消費(300ワード) ・ μ秒レベルのプロセス起動時間 ・
2000万プロセスが実行できたというベンチマークもあるらしい ・ 優れた耐障害性 ・ エラーが起こればプロセスごとやり直す Erlang VM(BEAM)
・ 強い動的型付けの関数型言語 ・ Erlang VM上で動作(Erlangの利点がそのまま活かせる) ・ Rubyに影響を受けた柔軟な構文 ・ Railsに影響を受けたWAF(Phoenix)がある ・
他の言語出身者でも馴染みやすい(※個人的な意見です) Elixir
実行環境
・ ローカルにインストールする ・ Wandbox(https://wandbox.org/)を使う ・ Dockerイメージを利用する 実行環境 オススメ
Elixirのイメージが提供されているのでそれを使う Dockerによる環境構築 ↑は容量が大きいので小さいほうが良ければ以下
Elixir + Phoenix用リポジトリ https://github.com/ponday-dev/elixir-on-docker ・ MariaDBとつなげるdocker-compose.ymlまで ・ 使い方はREADMEを参照
Hello, World
Hello, World シンプル版 ・ 標準出力はIO.puts関数 ・ 文字列はダブルクォートで囲む (シングルクォートは意味が異なる)
Hello, World シンプル版 関数版(無名関数) ・ fn (引数) -> endで無名関数が作れる ・
無名関数の呼び出しは (関数名).(引数)
Hello, World モジュール版 ・ defmoduleでモジュールを定義 ・ クラスではない ・ モジュール内に関数を定義するときは
fnではなくdef ・ モジュールに属する関数呼び出しは (関数名)(引数)の形式で可
データ構造
・ 整数 / 浮動少数 ・ 真偽値(true / false) ・ 文字列(バイナリ)
・ アトム(Rubyでいうシンボル) ・ nil(※データ型ではない) 基本データ型
・ リスト ・ タプル ・ キーワード付きリスト ・ マップ コレクション
・ 普通の配列 ・ 順序は保証されている リスト
・ メモリ上に連続して格納される ・ サイズ取得は高速、修正は低速 タプル
・ アトムと値のタプルで構成されたリスト ・ 順序は保証されている キーワード付きリスト
・ いわゆる連想配列 マップ
パターンマッチ
・ 値やデータ構造をマッチング(≠ 正規表現) ・ = は代入ではなくパターンマッチ演算子 ・ 制御構文、関数呼び出しなど色々な場面で使える パターンマッチ
・ 左辺に変数が来る場合は代入操作 ・ 再代入も可能 パターンマッチ(基本)
・ コレクションの構造に対してもマッチ可能 パターンマッチ(コレクション)
・ コレクションの構造に対してもマッチ可能 パターンマッチ(マップ)
制御構造
・ 条件が一つだけの条件分岐(else ifがない) ・ 三項演算子のような使い方も if
・ 複数の条件がある場合に利用 ・ いずれかの条件に一致しないとエラーになる cond
・ パターンマッチで条件分岐 ・ いずれかの条件に一致しないとエラーになる case
・ パターンマッチが成功する場合に実行 with
パイプライン演算子
・ Elixirのコードで頻出 ・ 連続した関数呼び出しを”|>”でつなげて記述 ・ 左辺のデータが右辺の関数の第一引数に適用 ・ コード上の記述と実際の処理の順序が同じになる パイプライン演算子
・ コードの記述と実際の処理順序が異なる ・ どこがどの関数の引数なのか分かりづらい 例:JavaScriptの場合 ※ 多くの言語で起こることでJSを貶める意図はありません
例:Elixirの場合 ・ コードの記述と実際の処理順序が同じ ・ 引数と関数の対応が明確 ・ ワンライナーも可
モジュール
・ 関数をまとめて名前空間を定義 ・ EnumやKeyword、Mapは標準提供のモジュール モジュール
・ モジュール内に定義される特殊なマップ ・ マップとパターンマッチが可能 構造体
・ モジュールは他言語で言うクラスではない ・ 構造体でデータ構造が定義できるものの、 これはインスタンスではない ・ インスタンスメソッドのような呼び出しはできない モジュール ≠
クラス
モジュール ≠ クラス
・ 関数呼び出し時、引数にもパターンマッチが適用 ・ パターンマッチの条件が異なれば、 同名の関数が複数定義できる 関数呼び出しとパターンマッチ
関数呼び出しとパターンマッチ ・ case do ~ endのマッチは関数呼び出し時点で可
関数呼び出しとパターンマッチ ・ 引数でパターンマッチ ・ 関数のワンライナー向け記法で行数を圧縮
サンプル
FizzBuzz
まとめ
・ ElixirはErlang VM上で動作する関数型言語 ・ 耐障害性がすごい ・ Dockerで簡単に試せる ・ パターンマッチとパイプラインが特徴的 まとめ
Elixirは良いぞ
Thank you !!