SlideShare a Scribd company logo
Closures and 
methodMissing 
are real 
G* ワークショップ Z 札幌 2014 
2014/09/27
日本語で言うと
クロージャも、 
methodMissing 
も、あるんだよ 
G* ワークショップ Z 札幌 2014 
2014/09/27
背景を付けると、
クロージャも、 
methodMissing 
も、あるんだよ 
G* ワークショップ Z 札幌 2014 
2014/09/27
お前誰よ 
• 名前:杉浦孝博 
• twitter : @touchez_du_bois 
• 夜のお仕事: 
深夜アニメ普及活動 
提督業(艦隊これくしょん)
It's not 
important, 
but... 
(余談ですが)
Do you know 
the DSL? 
(DSLをご存じですか?)
DSL 
• Domain Specific Languageの略。 
• 特定の領域(ドメイン)の問題を解決する 
ための言語。 
• 専用のパーサーを作る「外部DSL」と、 
プログラミング言語を利用する「内部 
DSL」、といった分け方ができる。
内部DSLの例 
• GrailsでSpring Beanの登録。 
// grails-app/conf/spring/resources.groovy 
! 
import my.company.MyBeanImpl 
! 
beans = { 
myBean(MyBeanImpl) { 
someProperty = 42 
otherProperty = "blue" 
} 
}
GroovyでDSL 
• Builder 
• Category 
• Operator overloading 
• Command chains 
• Closure 
• Meta programming 
• AST Transformer ...
Let’s make 
a DSL! 
(DSLを作ってみよう!)
お題 
• VoiceText Web API (β版) 
• https://cloud.voicetext.jp/webapi 
• 音声合成VoiceTextを簡単に使うことが 
できるWeb API 
• このWeb APIを叩くためのDSLを作っ 
てみる。
お題 
• こんな感じのAPI 
curl "https://api.voicetext.jp/v1/tts"  
-o "test.wav"  
-u "YOUR_API_KEY:"  
-d "text=おはようございます"  
-d "speaker=hikari"
お題 
• パラメータ 
text 合成するテキスト。エンコーディングはUTF-8。 
Unicodeで200文字以内。 
speaker 話者名 
emotion 感情カテゴリ 
emotion_level 感情レベル 
pitch 音の高低 
speed 話す速度 
volume 音量
VoiceText4J 
• @makingさん作のJava版ライブラリ 
• https://github.com/making/voicetext4j/ 
• 大いに参考にさせていただきました。
VoiceText4J 
import am.ik.voicetext4j.*; 
! 
System.setProperty("voicetext.apikey", “API_KEY"); 
! 
EmotionalSpeaker.HIKARI.ready() 
.pitch(105) 
.speed(105) 
.speak("おはようございます");
I made 
a DSL. 
(DSLを作ってみた)
こんな感じ 
import org.jggug.magica.voicetext4g.VoiceTextFactory 
import org.jggug.magica.voicetext4g.config.Speaker 
! 
def voiceText = VoiceTextFactory.create("YOUR_API_KEY") 
! 
voiceText.speak { 
speaker Speaker.HIKARI 
pitch 105 
speed 105 
"おはようございます" 
}
Demo. 
(でも)
デモのソース 
import org.jggug.magica.voicetext4g.VoiceTextFactory 
import org.jggug.magica.voicetext4g.config.Speaker 
! 
def voiceText = VoiceTextFactory.create("YOUR_API_KEY") 
! 
voiceText.speak { 
speaker Speaker.SHOW 
"どうも、奥さん、知ってるでしょ〜、大泉洋でございます。おい、パイ食わねえか?" 
}
Points 
(ポイント)
クロージャを使う 
voiceText 
.speaker(Speaker.HIKARI) 
.pitch(105) 
.speed(105) 
.speak("おはようございます") 
! 
↓ 
! 
voiceText.speak { 
speaker Speaker.HIKARI 
pitch 105 
speed 105 
"おはようございます" 
}
メソッド呼び出しのカッコ省略 
voiceText.speak( { 
speaker(Speaker.HIKARI) 
pitch(105) 
speed(105) 
"おはようございます" 
}) 
! 
↓ 
! 
voiceText.speak { 
speaker Speaker.HIKARI 
pitch 105 
speed 105 
"おはようございます" 
}
return 省略 
voiceText.speak { 
speaker Speaker.HIKARI 
pitch 105 
speed 105 
return "おはようございます" 
} 
! 
↓ 
! 
voiceText.speak { 
speaker Speaker.HIKARI 
pitch 105 
speed 105 
"おはようございます" 
}
クロージャの戻り値 
def speak(Closure c) { 
def text = c() 
// クロージャの戻り値の型がStringかGString以外の場合、 
// 何もしない 
if (!(text instanceof String || text instanceof GString)) { 
return 
} 
! 
// Web APIを叩き、音声を再生 
}
設定用のメソッド 
• VoiceTextクラスに、speakerやpitch 
等の設定用メソッドは定義しない。 
• 設定用のクラス(Config)のオブジェクト 
をメンバ変数に持つ。 
class VoiceText { 
Config config 
def speak(Closure c) { 
} 
}
delegateを変更 
class VoiceText { 
Config config 
def speak(Closure c) { 
c.delegate = this 
def text = c() 
} 
}
methodMissing 
class VoiceText { 
Config config 
def speak(Closure c) { 
c.delegate = this 
def text = c() 
} 
def methodMissing(String name, args) { 
config."${name}" = args[0] 
} 
}
To wrap up 
(まとめ)
まとめ 
• クロージャやmethodMissingなどを使 
うことで、自分だけのDSL(DSLっぽい 
もの)が作れる。 
• オレオレDSLで差を付けよう!
Get back 
on topic 
(閑話休題)
2014 
秋アニメ 
オススメ
Closures and methodMissing are real
PSYCHO-PASS 
2
Closures and methodMissing are real
棺のチャイカ 
第2期 
AVENGING 
BATTLE
Closures and methodMissing are real
selector 
spread 
WIXOSS
Closures and methodMissing are real
蟲師 
続章
ご清聴 
ありがとう 
ございました。

More Related Content

PDF
Groovyで学ぶプロセス代数 #jjug
PPTX
YAPC::ASIA 2012 LT GaiaX
PPTX
そんな装備で大丈夫か?
ODP
こんにちはGroovy
PDF
Hacking Ruby with Python
PPTX
技術ドキュメントで難しい英文に出会ったら
PDF
プログラミング・パラダイム
PDF
ネタプログラミング言語クリエイターYouma (Gunma.web #8 2012/03/03)
Groovyで学ぶプロセス代数 #jjug
YAPC::ASIA 2012 LT GaiaX
そんな装備で大丈夫か?
こんにちはGroovy
Hacking Ruby with Python
技術ドキュメントで難しい英文に出会ったら
プログラミング・パラダイム
ネタプログラミング言語クリエイターYouma (Gunma.web #8 2012/03/03)

What's hot (17)

PDF
道具を磨き続ける
PDF
Javaな人が今すぐ使えるG*
PPT
Javascriptで無限ループを実現する5つの方法
PPT
Smalltalk との比較で深まる Citrine の理解
PDF
Debug Hacks at Security and Programming camp 2011
PDF
Goでこれどうやるの? 入門
PDF
Programming camp 2010 debug hacks
PDF
神戸Rustの会 #1 LT - I'm lazy rust programmer
PDF
塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)
PPTX
20120822_dstn技術交流会_すぐに使えるsdkアダプタ開発
PPTX
JavaScript 非同期処理 入門
PDF
PHP-ML で手書き数字認識
PPTX
ここがすごい! なぞとPHP5.3
PDF
Go言語オーバービュー201507
PPTX
プログラミング技法特論第5回
ODP
Shortcodin
PPTX
仕事でも Groovy を使おう!
道具を磨き続ける
Javaな人が今すぐ使えるG*
Javascriptで無限ループを実現する5つの方法
Smalltalk との比較で深まる Citrine の理解
Debug Hacks at Security and Programming camp 2011
Goでこれどうやるの? 入門
Programming camp 2010 debug hacks
神戸Rustの会 #1 LT - I'm lazy rust programmer
塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)
20120822_dstn技術交流会_すぐに使えるsdkアダプタ開発
JavaScript 非同期処理 入門
PHP-ML で手書き数字認識
ここがすごい! なぞとPHP5.3
Go言語オーバービュー201507
プログラミング技法特論第5回
Shortcodin
仕事でも Groovy を使おう!
Ad

Viewers also liked (7)

PDF
ジャパネットQB GPars
PDF
GContractsの基礎
PDF
Introduction to Spock
PDF
Vert.x.tari.tari
PDF
GroovyからAnime
PDF
Goos 001
PDF
Groovyしたり RPしなかったり あとは時々布教活動したり
ジャパネットQB GPars
GContractsの基礎
Introduction to Spock
Vert.x.tari.tari
GroovyからAnime
Goos 001
Groovyしたり RPしなかったり あとは時々布教活動したり
Ad

Similar to Closures and methodMissing are real (20)

PDF
今日から始める Go言語 と appengine
PDF
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
PDF
LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介
PDF
テーマ制作時の疑問とノンプログラマーにも優しいテーマを考える
PDF
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
PDF
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
PDF
TechDo Goハンズオン#3
PDF
ビビッド・パワポ・オペレーションβ ~エンジニアのための、ゆるふわパワポ術~(qpstudy 2013.01 LT)
PDF
Easy scripting in Go
PDF
PHP7をDockerで動かしたという話
PDF
Play meetup-2-dev-best-practices
PDF
YAPC::Asia2015
PPTX
[141004] cedec 2014 참관기 & 강연 리뷰 #1
PDF
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
PPTX
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話
PDF
議論を描く技術「ファシリテーショングラフィック」
PDF
【Qp08】ざびたん2リリース報告lt 20111022
KEY
ぼくのがんがえたふつうのぎじゅつしゃ
PDF
PyCon APAC 2013 Web Secure Coding
PDF
これからの「言語」の話をしよう ―― 未来を生きるためのツール
今日から始める Go言語 と appengine
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介
テーマ制作時の疑問とノンプログラマーにも優しいテーマを考える
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
TechDo Goハンズオン#3
ビビッド・パワポ・オペレーションβ ~エンジニアのための、ゆるふわパワポ術~(qpstudy 2013.01 LT)
Easy scripting in Go
PHP7をDockerで動かしたという話
Play meetup-2-dev-best-practices
YAPC::Asia2015
[141004] cedec 2014 참관기 & 강연 리뷰 #1
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話
議論を描く技術「ファシリテーショングラフィック」
【Qp08】ざびたん2リリース報告lt 20111022
ぼくのがんがえたふつうのぎじゅつしゃ
PyCon APAC 2013 Web Secure Coding
これからの「言語」の話をしよう ―― 未来を生きるためのツール

Closures and methodMissing are real