Text
Page: 1
Techmix
Hokkaido
2014 Elixir
Page: 2
発表するひと
ヽ(´・⾁・`)ノ
@niku̲name
Page: 3
コンサドーレ札幌アドベント
カレンダー2014
http://www.adventar.org/
calendars/406
Page: 4
Elixriいつできたの?
https://github.com/elixir-
lang/elixir/
最初のコミットは 3 年前
(2011-01-09)
Page: 5
誰が作りはじめたの?
Jose Valim さん
Ruby On Rails のコミッタ
RubyKaigi2013 のキーノート
http://gihyo.jp/news/report/01/
rubykaigi2013/0002
Page: 6
どんな⾔語なの?
ErlangVM の上で動作する動的
な関数型⾔語
Elixirの特徴
http://qiita.com/niku/
items/7c61d6a6af38896ac603
Page: 7
いいところ
⼀般的
特徴的
親しみや
すそう
普段お使
いの⾔語
+ α があ
る
Lisp,
Haskell,
Erlang…
Elixir,
Scala
Page: 8
Elixir
(僕が) したしみやすそう
便利
道具が揃ってる :: ErlangVM や
Erlang のライブラリを使える
構⽂を拡張しやすい :: Lisp みたいな
マクロが書ける
Page: 11
ツール
ユニットテストツール ExUnit
インタラクティブシェル IEx
ビルドツール Mix
パッケージ管理ツール Hex
Page: 15
挨拶を返す
挨拶(greet)を命令すると
“graaaa…” と返すようにしたい
Page: 16
テスト実⾏
まだ作ってないので失敗する
Page: 18
テスト実⾏
通った.
いつも通りに開発できる.
Page: 19
コマンドラインから使う
escript を使えばできる
エラーが!
Page: 20
エラーメッセージをよくみる
(Mix) Could not generate
escript,
please set :main̲module in
your project configuration
(under option) to a
module
that implements main/1
Page: 21
必要なものを実装
エラーメッセージから
main 関数がどのモジュールに
あるかを config で指定する
main/1 関数名がmainで引数が
1つの関数の用意をする
が必要だとわかる
Page: 25
天気情報を取得する
HTTP経由でAPIから天気を取得
http://weather.livedoor.com/
weather̲hacks/webservice
Page: 26
外部ライブラリの利用
HTTPアクセス するのに
httpoison
https://github.com/edgurgel/
httpoison
JSON解析 するのに exjsx
https://github.com/talentdeficit/
exjsx
Page: 29
インタラクティブシェル IEX
動作を確認するのに使う
Page: 32
ここから
ふつうではありません ^q^
Page: 33
ErlangVM由来のふつうでは
ないこと
プロセスをたくさんつくれる
分散させやすい
耐障害性が⾼い
Page: 34
プロセスをたくさんつくれる
https://gist.github.com/
niku/7301933
Page: 36
同時に100万個⽣成
Macbook Proで9秒
Page: 38
耐障害性が⾼い
(省略)
⼒不⾜により簡単なサンプルを用
意できませんでした
Page: 39
Elixir独自のふつうではない
こと
マクロ!
Elixirでメタプログラミングする
のに使う
Page: 40
マクロ?
書いてあるコードを実⾏し始める
前に書き換える
Page: 41
どんなことができるの?
たとえば IF 式が作れます
Page: 43
myif を作ってみる
評価対象(trueかfalseになる)
true のときにやること
false のときにやること
Page: 44
JavaScriptでmyif
よさそう
Page: 46
Javascriptでmyif
あれ……
Page: 47
Javascriptでmyif
myifの結果を返すときではなく,
myifに引数を渡すときに評価され
てしまう
Page: 48
Javascriptでmyif
渡すときにfunctionにしておけ
ば,結果を返すときに評価してく
れる
Page: 49
Javascriptでmyif
引数に渡すときのfunctionを無
くすことはできないのか?
=>引数に渡ってくる内容を
functionとして,引数を受けと
るときには評価しないようにで
きないの?
JavaScriptでのやり⽅を知らな
い……
Page: 50
奥がふかいif
いつも使っているやつなのに,思
ったよりたくさんの要素がある
Page: 51
Elixirでmyif
関数でやると,JavaScriptと同
じ悩みにあたる
マクロ!
Page: 53
Elixirでmyif
実⾏結果
なんだこれは……
Page: 54
Elixirでmyif
http://elixir-lang.org/
getting̲started/meta/1.html
Elixir の⽂献によると
3要素のくみあわせになっている
Page: 55
Elixirでmyif
⼀番目の要素はアトムかタプ
ル.タプルの場合はこの構造と
同じになっている
⼆番目の要素はメタデータ.⾏
数とか⽂脈が書いてある.
三番目の要素はアトムか関数呼
び出しの引数.アトムの場合,
このひとかたまりタプルは変数
である.
Page: 56
Elixirでmyif
IO.inspect(clause)のなかみ
Page: 57
Elixirでmyif
1 番目のタプルのなかみ
Page: 58
Elixirでmyif
以下略.たしかにそのようにな
っているようだ.
これなんなの? => AST(抽象構
⽂⽊)です
ASTってなんなの?プログラム
の構造をプログラムで表したも
のです
Page: 59
Elixirでmyif
とりあえず忘れてください.
IO.inspect の出⼒が最後に出てく
ることに注目
Page: 60
Elixirでmyif
IO.inspect の出⼒が最後に出て
くる
つまり引数で受けたときにはま
だ評価されていない
Page: 62
Elxiirでmyif
できた
マクロは慣れていない⼈類には
早すぎる感
Page: 63
Elixirでmyif
Never use a macro when
you can use a function
– Programming Elixir
Page: 64
まとめ
ライブラリを使う⼈には現代的
でしたしみやすい
ライブラリを作る⼈にはほとん
どなんでもできる
Page: 65
宣伝
毎週だいたい⽊曜⽇にErlangVM
に関すること(Elixir含む)や,そ
うではないことをワイワイやる
Sapporo.beamをやってます
前回は⾼級トイレットペーパー
のはなしやこの資料の作成をし
てました