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
Scalalr
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kazuhiro Ichikawa
March 17, 2018
Programming
2.5k
1
Share
Scalalr
Scalaの型システムを悪用して好きな文法のDSLをScala上で実現するためのライブラリ
Kazuhiro Ichikawa
March 17, 2018
More Decks by Kazuhiro Ichikawa
See All by Kazuhiro Ichikawa
Tuples and Mirrors in Scala3 and Higher-Kinded Data
phenan
0
1.7k
自己関手の圏における モノイド対象 in Scala
phenan
0
630
ValiantParsing
phenan
1
130
Intro to typeclass in Scala
phenan
10
2.6k
Other Decks in Programming
See All in Programming
書き換えて学ぶTemporal #fukts
pirosikick
2
380
なぜあなたのコードには「コシ」がないのか?〜AI時代に問う、最後まで美味しい設計と戦略〜 #phpconkagawa / phpconkagawa2026
shogogg
0
210
Terraform言語の静的解析 / static analysis of Terraform language
wata727
1
150
サーバーレスで作る、動画データ管理基盤
oyasumipants
0
210
Agentic UI in the Frontend: Architectures with Open Standards @JAX 2026 in Mainz
manfredsteyer
PRO
0
120
Symfony AI in Action - SymfonyLive Berlin 2026
chr_hertel
1
150
Cloudflare で始める Data Platform
ta93abe
0
170
AI時代のエンジニアリングの原則 / Engineering Principles in the AI Era
haru860
0
1.3k
[BalkanRuby 2026] Drop your app/services!
palkan
2
200
[RubyKaigi 2026] Require Hooks
palkan
1
320
AIを導入する前にやるべきこと
negima
2
360
実践ハーネスエンジニアリング:ステアリングループを実例から読み解く / Practical Harness Engineering: Understanding Steering Loops Through Real-World Examples
nrslib
5
5.5k
Featured
See All Featured
Darren the Foodie - Storyboard
khoart
PRO
3
3.3k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Abbi's Birthday
coloredviolet
2
7.6k
GitHub's CSS Performance
jonrohan
1033
470k
Writing Fast Ruby
sferik
630
63k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
220
For a Future-Friendly Web
brad_frost
183
10k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
30 Presentation Tips
portentint
PRO
1
290
Accessibility Awareness
sabderemane
1
120
HDC tutorial
michielstock
2
660
Transcript
4DBMBMS 4DBMBͷݴޠػߏΛѱ༻ͯ͠ ࠷ڧͷ%4-Λ࡞ΔϥΠϒϥϦ !QIFOBO 4DBMB.BUTVSJൃදࢿྉ
• Twitter: @phenan • Github: phenan • ࠓͷ: ໘ന͍ϥΠϒϥϦΛ࡞ͬͨͷͰհ͠·͢ •
͜ͷεϥΠυ: https://speakerdeck.com/phenan/scalalr
͜Μͳײ͡Ͱ%4-Λఆٛ͢Δ
JValue のDSL
JValue のDSL こうかいて これをよびたい
JValue のDSL こうかいて これをよびたい カンマくぎり
JValue のDSL JSONのObjectの かきかた Objectのそれぞれの プロパティ
͜Μͳײ͡Ͱ͑Δʂ
͜Μͳײ͡Ͱ͑Δʂ これ
͜Μͳײ͡Ͱ͑Δʂ これ
͜Μͳײ͡Ͱ͑Δʂ これ これ
ׅހ͕͍ͬͺ͍͋Δ
ׅހݴޠͷڥքΛ͋ΒΘ͢ JSON DSLに Scala value をわたしている
ׅހݴޠͷڥքΛද͢ Scalaに JSON DSLを わたしている 1ライナーのDSLなら()はいらない
ͯ͠΄͍͠
4DBMBͰ͜Μͳͷॻ͚͚ͨͬʁ
4DBMBͰ͜Μͳͷॻ͚͚ͨͬʁ [a, b] ?
4DBMBͰ͜Μͳͷॻ͚͚ͨͬʁ [a, b] ? : のあとは タイプでは?
4DBMBͰ͜Μͳͷॻ͚͚ͨͬʁ [a, b] ? : のあとは タイプでは? {a, b} ?
ίϯύΠϥ֦ுʁ
͍͍͑ɺ ૉͷ4DBMBͰ͢
'POU-JHBUVSF ͜Ε࣮…
'POU-JHBUVSF
'POU-JHBUVSF 7BMJEͳ4DBMBίʔυ
4DBMBMS w ઐ༻ϑΥϯτ4DBMJHͷར༻Λલఏͱͨ͠ίʔυΛੜ͢Δ w %4-ͷݟͨΛࣗ༝ʹม͑ΒΕΔΑʂͬͨͶʂ w ίϯύΠϧʹ͕͔͔࣌ؒΔͷ͕ͪΐͬͱͨ͠ ཁૉͷ+40/ͷྻͷίϯύΠϧʹ࣌ؒҎ্͔͔ͬͨ w ຯʹଧͭͷ͕໘ͳͷͰΤσΟλαϙʔτ։ൃ͍ͨ͠
w IUUQTHJUIVCDPNQIFOBOTDBMBMS
ٕज़తৄࡉ w !ETMΞϊςʔγϣϯϚΫϩ w JNQMJDJUQBSBNFUFSΛѱ༻ͯ͠ίϯύΠϧ࣌-"-3ߏจղੳ w ܕˠඇऴه߸ จ๏Λදݱ͢Δͭ w
ҙͷ෦ࣜΛׅހͰׅͬͨ4DBMBࣜͰஔ͖͑Մೳʹ͢ΔͨΊʹ ͪΐͬͱෳࡶͳ͜ͱΛ͍ͯ͠Δ w ͜ͷख๏ΛԠ༻ͯ͠ࣈ۟ղੳΛมߋՄೳʹ͢Δ͜ͱͰ͖Δ ͣ w ΞϯΧϯϑΝϨϯεͰͯ͠Έ͍ͨ ͚ͲεϥΠυ༻ҙͯ͠ͳ͍
%4-ͷ࡞Γํ w ߏจղੳثΛ࡞ΔϓϩάϥϜ"45 w ΠϯλϓϦλΛ࡞Δ"45
%4-ͷ࡞Γํ w ߏจղੳثΛ࡞ΔϓϩάϥϜ"45 w ΠϯλϓϦλΛ࡞Δ"45 ؔΛݺྑ͍͚ͩ
%4-ͷ࡞Γํ w ߏจղੳثΛ࡞ΔϓϩάϥϜ"45 w ΠϯλϓϦλΛ࡞Δ"45 ؔΛݺྑ͍͚ͩ ͬͪ͜ΛͲ͏͢Δ͔
Λ؆୯ʹ͢Δ w %4-ΛBCDEFʜͷΑ͏ʹॻ͘ͷͱ͢Δ w ϝιουݺͼग़͠PSϑΟʔϧυࢀরͷνΣΠϯ w ࣮͜ͷه๏4DBMBMSαϙʔτ͍ͯ͠Δ
Կ͕Ͱ͖Εྑ͍͔ w ϓϩάϥϜBCDEFʜͷͦΕͧΕͷؔݺͼग़͠Λݕࠪ w ϓϩάϥϜஅยBCͷ͕࣍DͰ͋Δͷਖ਼͍͠ೖྗ͔ʁ w ΦʔτϚτϯΛ࡞Δʂ S1 S2 S3
S4 B C D
Ϋϥεͱϝιου w ঢ়ଶ4ͷͱ͖͚ͩݺΔؔDΛ࡞Εྑ͍ w Ϋϥε4ͷϝιουD͕4ܕͷΛฦͤྑ͍ S1 S2 S3 S4 B
C D
͜Εͩͱਖ਼نදݱ͘Β͍͔͠Ͱ͖ͳ͍ w ܾఆੑ༗ݶΦʔτϚτϯ w ͏গ͠ڧ͍ߏจղੳ͕͍ͨ͠ w -3ߏจղੳΛ࠶ݱ͢Δʂ S1 S2 S3
S4 B C D
-3ΦʔτϚτϯ w ܾఆੑ༗ݶΦʔτϚτϯͷࣗવͳ֦ு w SFEVDF࠷ۙಡΜ͍͔ͩͭ͘ͷτʔΫϯΛͳ͔ͬͨ͜ͱʹͯ͠ɺ ผͷτʔΫϯΛಡΜͩ͜ͱʹ͢Δ S1 S2 S3 S4
&YQS 5FSN S5 /VN /VN S6 5FSN
-3ΦʔτϚτϯ w ܾఆੑ༗ݶΦʔτϚτϯͷࣗવͳ֦ு w SFEVDF࠷ۙಡΜ͍͔ͩͭ͘ͷτʔΫϯΛͳ͔ͬͨ͜ͱʹͯ͠ɺ ผͷτʔΫϯΛಡΜͩ͜ͱʹ͢Δ SFEVDF5FSN/VN SFEVDF&YQS&YQS 5FSN S1
S2 S3 S4 &YQS 5FSN S5 /VN /VN S6 5FSN
*NQMJDJUQBSBNFUFSΛ͏ʂ w 3FEVDFՄೳ͔Ͳ͏͔ΛJNQMJDJUQBSBNFUFSʹ͢Δ w 44Λܦ༝ͯ͠4ʹSFEVDFՄೳͳͷͰ ϝιου͕ݺΔΑ͏ʹ͢Δ SFEVDF5FSN/VN SFEVDF&YQS&YQS 5FSN S1
S2 S3 S4 &YQS 5FSN S5 /VN /VN S6 5FSN
࣮Πϝʔδ implicit class PlusTransition[Sn] (sn: Sn) { def plus (implicit
reduce: SnからS2にreduce可能): S3 = { reduce(sn).plus() } } ҙͷঢ়ଶ4O 4ʹSFEVDFՄೳͰ͋Ε QMVTΛݺͿ͜ͱ͕Ͱ͖Δ
3FEVDFͷఆٛ trait Reduce[Sx, Sy] { def apply (sx: Sx): Sy
} implicit def doubleReduce [Sx, Sy, Sz] (implicit reduce1: Reduce[Sx, Sy], reduce2: Reduce[Sy, Sz]) : Reduce[Sx, Sz] = { new Reduce[Sx, Sz] { def apply (sx: Sx): Sz = reduce2(reduce1(sx)) } } SFEVDFՄೳ͔Ͳ͏͔Λදݱ͢Δ NVMUJQBSBN ܕΫϥε SFEVDFਪҠత 4Y4Z͔ͭ4Z4[ͳΒ4Y4[
3FEVDFͷఆٛ implicit val reduceFromS5ToS6: Reduce[S5, S6] = { new Reduce[S5,
S6] { def apply (s5: S5): S6 = S6(Term(s5.value)) } } 44ͷSFEVDFఆٛ /VNͷΘΓʹ5FSNΛಡΜͩ͜ͱʹ͢Δ SFEVDF5FSN/VN SFEVDF&YQS&YQS 5FSN S1 S2 S3 S4 &YQS 5FSN S5 /VN /VN S6 5FSN
ຊͷ࣮͏গ͠ෳࡶ w -"-3ߏจղੳʹ͢ΔͨΊʹɺ 3FEVDFՄೳ͔Ͳ͏͔ͷஅʹ࣍ͷτʔΫϯΛ͏ w BCDEFʜͰ͕ඞཁͳͷͰɺ ຊBC D E F
ʜͷܗʹ͍ͨ͠ w ͜͏͢ΕBCDEFʜͷΑ͏ʹॻ͚Δʂ w CϝιουΛDΛҾʹͱΔϝιουʹͯ͠ɺ ͭͿΜͷঢ়ଶભҠΛҰؾʹΕྑ͍
ຊͷ࣮ߋʹෳࡶ w ҙͷ෦ࣜΛ 4DBMBͷࣜ Ͱஔ͖͑ΒΕΔΑ͏ʹ͍ͨ͠ w BC D E F
ʜͷͲͷ෦Λஔ͖͑Δ͔ʹΑ͕ͬͯҧ͏ w Bͷ෦JNQMJDJUDMBTTΛఆٛͯ͠CϝιουΛݺΔΑ͏ʹ w Dͷ෦Cϝιου͕4DBMBͷࣜΛҾʹऔΕΔΑ͏ʹ͢Δ w Cͷ෦ʹ4DBMB͕ࣜೖΔͱB C D E F ͱͳΓ݁߹͕มΘΔʂ w B C D Ͱͭͷঢ়ଶભҠΛҰʹΕྑ͍ʂ w ಉ༷ʹOݸͷঢ়ଶભҠΛҰʹΔΈ͕ඞཁ
4DBMBMS<IUUQTHJUIVCDPNQIFOBOTDBMBMS> w ࣮ଶ-"-3 ύʔβδΣωϨʔλ w ී௨ͷύʔβͰͳ͘JNQMJDJUWBMVFͷఆٛΛੜ͢Δ w !ETMΞϊςʔγϣϯϚΫϩʹΑΓίϯύΠϧ࣌ʹίʔυੜ w
ϚΫϩύϥμΠεϚΫϩࠈͩͥ w %4-ϢʔβJNQPSU͢Δ͚ͩͰ%4-Λ͑Δʂ w ίϯύΠϧʹ͕͔͔࣌ؒΔ w -"-3ઢܗͷΞϧΰϦζϜ͕ͩɺ࣮ଌͩͱ0 O ͘Β͍ʹݟ͑Δ