SlideShare a Scribd company logo
1 of 25
Template Engine for Elixir
Embedded Elixir
2016/09/22 tokyo.ex #6 おーはら
Agenda
自己紹介
|> 趣旨
|> TemplateEngineとは
|> EExとは
|> EExの構成
|> eval_(string|file)
|> function_from_(string|file)
|> compile_(string|file)
|> 仕組み
|> ASTとは
|> compile
|> Tokenizer
|> Engine
|> まとめ
自己紹介
• おーはら@ohrdev
– 基盤技術部@ドリコム
• 仕事/技術スタック
– 広告サービスのお世話
– 全社基盤システムのお世話
– Elixir/Erlang/Ruby/LFE/Lisp/etc…
• コミュニティ
– ElixirMeetUp、tokyo.ex、VR.tokyo
– tokyo.erl(予定、10月前半頃に告知します)
趣旨
• ターゲット
– EEx is 何? な方
• ゴール
– EExの使い方がわかる
– EExの仕組みがわかる
TemplateEngineとは
• テンプレート(雛形)と入力デー
タを合成してドキュメント(文字
列)を出力するソフトウェア
– ex) jinja2, jade, erb, haml, slim,
etc
• ウェブページ(マークアップ)を出
力するエンジンを特に、ウェブ
テンプレートエンジンと言う
– WAFにバンドルされてる事が多
い(Railsのerbなど)
EExとは
• Embedded Elixir (EEx)
• 文字列、テンプレートにElixirのコードを評価し
て埋め込む処理を提供するモジュール
• Elixirにデフォルトでバンドル
– https://github.com/elixir-
lang/elixir/tree/master/lib/eex
EExの構成
• 主要API
– eval_string, eval_file
• 入力データと文字列/ファイルを直接評価して文字列を
出力、実行毎にcompile/evalするので遅い
– function_from_string, function_from_file
• 文字列/ファイルから、入力データを引数にして文字列
を出力する関数を定義するマクロ
– compile_string, compile_file
• 上2つのAPIの内部で使用される、文字列/ファイルを
ElixirのASTにコンパイルする
eval_string
EEx.eval_string <source>, <binding>, <option>
eval_file
EEx.eval_file <file>, <binding>, <option>
function_from_(string|file)
EEx.function_from_string <type>, <name>, <source>, <args>, <option>
EEx.function_from_file <type>, <name>, <file>, <args>, <option>
function_from_string(public)
function_from_string(private)
function_from_file
仕組み:eval_(string|file)
<source> <file>
EEx.compile_string
EEx.compile_file
EEx.eval_string <source>, <binding>
EEx.eval_file <file>, <binding>
EEx.do_eval
Result Document
<binding>
ElixirのAST
Code.eval_quoted
実行毎に、compile,
evalされる
遅い!
<file>が更新されて
も、即反映される
仕組み:function_from_(string|file)
<source> <file>
EEx.function_from_string
EEx.function_from_file
EEx.function_from_string <type>,
<name>, <source>, <args>
EEx.function_from_file <type>,
<name>, <file>, <args>
Result Document
BEAM
macro
def(p) name(args) do
<source> or <file>
end
compile
expand
VMname(a1, a2 …)
load
compileしてから実行
phoenix_live_reloader
等でリロード
<file>が更新されると、
再compileが必要
ASTとは
• Abstract Syntax Tree
• Elixirの式の内部表現、以下のタプルで表す
– { :関数名, メタデータ, 引数 }
– ex) 1 + 1 #=> {:+, [metadatas], [1, 1]}
• quote でASTを確認できる
ASTとは
• Code.eval_quoted でASTを評価できる
– eval_quoted <ast>, <binding>
• 詳しくは、 Metaprogramming Elixir を参照
– https://www.amazon.co.jp/dp/B00U1VU2GA
compile
• compile_string, compile_file の実体は、
EEx.Compiler.compile <source>, <option>
• EEx.Engine|EEx.SmartEngine を使って、出力
文字列のASTを返却する
compile
compileの流れ
EEx.Tokenizer.tokenize
<source>
<tokens>
EEx.Engine.init EEx.Engine.handle_body
buffer
<AST>
EEx.Engine.handle_text EEx.Engine.handle_expr
入力文字列をトークン
のリストに変換
Tokenizer
• Elixirコード(ロジックやバインディング)を含む
文字列をTokenのリストに変換する
compileの流れ
EEx.Tokenizer.tokenize
<source>
<tokens>
EEx.Engine.init EEx.Engine.handle_body
buffer
<AST>
EEx.Engine.handle_text EEx.Engine.handle_expr
Engine
初期Buffer
後処理
BufferとTokenから
quoteされた式を返却
Engine
• Tokenをバッファを使って、quoteされた式
(AST)に変換する
• 4つのコールバックを実装する必要がある(ビ
ヘイビア)
– init/1, handle_text/2, handle_expr/3,
handle_body/1
• デフォルトはEEx.SmartEngine
• compile時の:engineオプションで使用する
Engineを指定
カスタムEngine
• カスタムエンジンの使い方
– init, handle_test, handle_expr, handle_bodyの
callbackを実装したエンジンモジュールを作成
– コンパイル時の:engineオプションで指定
まとめ
• ElixirのテンプレートエンジンのEExを紹介しま
した
• テンプレートとデータからドキュメント(文字列)
を出力する流れを説明しました
• コンパイル時のトークナイザー、エンジンの処
理を説明しました
• カスタムエンジンの作り方を説明しました

More Related Content

Similar to Tokyoex6 EEx

jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶShumpei Shiraishi
 
t字形Er(10頁版)
t字形Er(10頁版)t字形Er(10頁版)
t字形Er(10頁版)聡 鳥谷部
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介Akira Tanaka
 
関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開Hideki Takase
 
2018年01月27日 Keras/TesorFlowによるディープラーニング事始め
2018年01月27日 Keras/TesorFlowによるディープラーニング事始め2018年01月27日 Keras/TesorFlowによるディープラーニング事始め
2018年01月27日 Keras/TesorFlowによるディープラーニング事始めaitc_jp
 
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトOpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトuchan_nos
 
Let's stady Machine Learning with OCSJ
Let's stady Machine Learning with OCSJLet's stady Machine Learning with OCSJ
Let's stady Machine Learning with OCSJtuchimur
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集terurou
 
SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用Takuya Iwatsuka
 
TOPPERS TECS WG 2016
TOPPERS TECS WG 2016TOPPERS TECS WG 2016
TOPPERS TECS WG 2016Hiroshi Oyama
 
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)Takuya Azumi
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
2019 05-19.overview
2019 05-19.overview2019 05-19.overview
2019 05-19.overviewShin-ya Koga
 
第84回 雲勉【オンライン:初心者向け】ECS入門 _ CloudFront + ELB + ECS FargateでWebサイトを公開
第84回 雲勉【オンライン:初心者向け】ECS入門 _ CloudFront + ELB + ECS FargateでWebサイトを公開 第84回 雲勉【オンライン:初心者向け】ECS入門 _ CloudFront + ELB + ECS FargateでWebサイトを公開
第84回 雲勉【オンライン:初心者向け】ECS入門 _ CloudFront + ELB + ECS FargateでWebサイトを公開 Keisuke Matsuda
 
関数型言語ElixirのIoTシステムへの導入に向けた基礎評価
関数型言語ElixirのIoTシステムへの導入に向けた基礎評価関数型言語ElixirのIoTシステムへの導入に向けた基礎評価
関数型言語ElixirのIoTシステムへの導入に向けた基礎評価Hideki Takase
 
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計アシアル株式会社
 
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介Shintaro Hosoai
 
技術勉強会(Solr入門編)
技術勉強会(Solr入門編)技術勉強会(Solr入門編)
技術勉強会(Solr入門編)Atsushi Takayasu
 

Similar to Tokyoex6 EEx (20)

jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
t字形Er(10頁版)
t字形Er(10頁版)t字形Er(10頁版)
t字形Er(10頁版)
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
 
関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
 
2018年01月27日 Keras/TesorFlowによるディープラーニング事始め
2018年01月27日 Keras/TesorFlowによるディープラーニング事始め2018年01月27日 Keras/TesorFlowによるディープラーニング事始め
2018年01月27日 Keras/TesorFlowによるディープラーニング事始め
 
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトOpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
 
Let's stady Machine Learning with OCSJ
Let's stady Machine Learning with OCSJLet's stady Machine Learning with OCSJ
Let's stady Machine Learning with OCSJ
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
 
SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用
 
TOPPERS TECS WG 2016
TOPPERS TECS WG 2016TOPPERS TECS WG 2016
TOPPERS TECS WG 2016
 
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
2019 05-19.overview
2019 05-19.overview2019 05-19.overview
2019 05-19.overview
 
第84回 雲勉【オンライン:初心者向け】ECS入門 _ CloudFront + ELB + ECS FargateでWebサイトを公開
第84回 雲勉【オンライン:初心者向け】ECS入門 _ CloudFront + ELB + ECS FargateでWebサイトを公開 第84回 雲勉【オンライン:初心者向け】ECS入門 _ CloudFront + ELB + ECS FargateでWebサイトを公開
第84回 雲勉【オンライン:初心者向け】ECS入門 _ CloudFront + ELB + ECS FargateでWebサイトを公開
 
関数型言語ElixirのIoTシステムへの導入に向けた基礎評価
関数型言語ElixirのIoTシステムへの導入に向けた基礎評価関数型言語ElixirのIoTシステムへの導入に向けた基礎評価
関数型言語ElixirのIoTシステムへの導入に向けた基礎評価
 
solr勉強会資料
solr勉強会資料solr勉強会資料
solr勉強会資料
 
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計
 
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
 
技術勉強会(Solr入門編)
技術勉強会(Solr入門編)技術勉強会(Solr入門編)
技術勉強会(Solr入門編)
 
Elixir lang bootstrap
Elixir lang bootstrapElixir lang bootstrap
Elixir lang bootstrap
 

More from Tsunenori Oohara

パンチラに関する考察
パンチラに関する考察パンチラに関する考察
パンチラに関する考察Tsunenori Oohara
 
Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486Tsunenori Oohara
 
Elixirハンズオン-2017-03-11
Elixirハンズオン-2017-03-11Elixirハンズオン-2017-03-11
Elixirハンズオン-2017-03-11Tsunenori Oohara
 
失敗という概念が存在しない退屈なweb開発
失敗という概念が存在しない退屈なweb開発失敗という概念が存在しない退屈なweb開発
失敗という概念が存在しない退屈なweb開発Tsunenori Oohara
 
Elixirと他言語の比較的紹介 ver.2
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2Tsunenori Oohara
 
Elixirについて私が知ってる二、三の事柄
Elixirについて私が知ってる二、三の事柄Elixirについて私が知ってる二、三の事柄
Elixirについて私が知ってる二、三の事柄Tsunenori Oohara
 
地獄のElixir(目黒スタートアップ勉強会)
地獄のElixir(目黒スタートアップ勉強会)地獄のElixir(目黒スタートアップ勉強会)
地獄のElixir(目黒スタートアップ勉強会)Tsunenori Oohara
 
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介Tsunenori Oohara
 

More from Tsunenori Oohara (16)

Elixirハンズオン2
Elixirハンズオン2Elixirハンズオン2
Elixirハンズオン2
 
meguro.rb LT
meguro.rb LTmeguro.rb LT
meguro.rb LT
 
Elixir解答
Elixir解答Elixir解答
Elixir解答
 
Elixir言語紹介
Elixir言語紹介Elixir言語紹介
Elixir言語紹介
 
パンチラに関する考察
パンチラに関する考察パンチラに関する考察
パンチラに関する考察
 
how-to-learn-elixir
how-to-learn-elixirhow-to-learn-elixir
how-to-learn-elixir
 
Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486
 
Elixirハンズオン-2017-03-11
Elixirハンズオン-2017-03-11Elixirハンズオン-2017-03-11
Elixirハンズオン-2017-03-11
 
失敗という概念が存在しない退屈なweb開発
失敗という概念が存在しない退屈なweb開発失敗という概念が存在しない退屈なweb開発
失敗という概念が存在しない退屈なweb開発
 
tokyo.ex3 LT
tokyo.ex3 LTtokyo.ex3 LT
tokyo.ex3 LT
 
Elixirと他言語の比較的紹介 ver.2
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2
 
Elixirについて私が知ってる二、三の事柄
Elixirについて私が知ってる二、三の事柄Elixirについて私が知ってる二、三の事柄
Elixirについて私が知ってる二、三の事柄
 
elixir in production
elixir in productionelixir in production
elixir in production
 
地獄のElixir(目黒スタートアップ勉強会)
地獄のElixir(目黒スタートアップ勉強会)地獄のElixir(目黒スタートアップ勉強会)
地獄のElixir(目黒スタートアップ勉強会)
 
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
 
地獄Spec
地獄Spec地獄Spec
地獄Spec
 

Tokyoex6 EEx