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
Kazuhiro Ichikawa
March 17, 2018
Programming
1
2.2k
Scalalr
Scalaの型システムを悪用して好きな文法のDSLをScala上で実現するためのライブラリ
Kazuhiro Ichikawa
March 17, 2018
Tweet
Share
More Decks by Kazuhiro Ichikawa
See All by Kazuhiro Ichikawa
Tuples and Mirrors in Scala3 and Higher-Kinded Data
phenan
0
1.5k
自己関手の圏における モノイド対象 in Scala
phenan
0
440
ValiantParsing
phenan
1
84
Intro to typeclass in Scala
phenan
10
2.3k
Other Decks in Programming
See All in Programming
Spatial Rendering for Apple Vision Pro
warrenm
0
110
nekko cloudにおけるProxmox VE利用事例
irumaru
3
430
Mermaid x AST x 生成AI = コードとドキュメントの完全同期への道
shibuyamizuho
0
160
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
190
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
450
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
460
htmxって知っていますか?次世代のHTML
hiro_ghap1
0
340
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.7k
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
3
280
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
MCP with Cloudflare Workers
yusukebe
2
220
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
170
Featured
See All Featured
RailsConf 2023
tenderlove
29
940
How STYLIGHT went responsive
nonsquared
95
5.2k
A designer walks into a library…
pauljervisheath
204
24k
Typedesign – Prime Four
hannesfritz
40
2.4k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
The Invisible Side of Design
smashingmag
298
50k
Statistics for Hackers
jakevdp
796
220k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
KATA
mclloyd
29
14k
How To Stay Up To Date on Web Technology
chriscoyier
789
250k
Six Lessons from altMBA
skipperchong
27
3.5k
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 ͘Β͍ʹݟ͑Δ