Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scalalr

 Scalalr

Scalaの型システムを悪用して好きな文法のDSLをScala上で実現するためのライブラリ

D1c239babc57d9bbb8314f72c09844c1?s=128

Kazuhiro Ichikawa

March 17, 2018
Tweet

More Decks by Kazuhiro Ichikawa

Other Decks in Programming

Transcript

  1. 4DBMBMS 4DBMBͷݴޠػߏΛѱ༻ͯ͠
 ࠷ڧͷ%4-Λ࡞ΔϥΠϒϥϦ !QIFOBO 4DBMB.BUTVSJൃදࢿྉ

  2. • Twitter: @phenan • Github: phenan • ࠓ೔ͷ࿩: ໘ന͍ϥΠϒϥϦΛ࡞ͬͨͷͰ঺հ͠·͢ •

    ͜ͷεϥΠυ: https://speakerdeck.com/phenan/scalalr
  3. ͜Μͳײ͡Ͱ%4-Λఆٛ͢Δ

  4. JValue
 のDSL

  5. JValue
 のDSL こうかいて これをよびたい

  6. JValue
 のDSL こうかいて これをよびたい カンマくぎり

  7. JValue
 のDSL JSONのObjectの かきかた Objectのそれぞれの プロパティ

  8. ͜Μͳײ͡Ͱ࢖͑Δʂ

  9. ͜Μͳײ͡Ͱ࢖͑Δʂ これ

  10. ͜Μͳײ͡Ͱ࢖͑Δʂ これ

  11. ͜Μͳײ͡Ͱ࢖͑Δʂ これ これ

  12. ׅހ͕͍ͬͺ͍͋Δ

  13. ׅހ͸ݴޠͷڥքΛ͋ΒΘ͢ JSON DSLに
 Scala value
 をわたしている

  14. ׅހ͸ݴޠͷڥքΛද͢ Scalaに
 JSON DSLを
 わたしている 1ライナーのDSLなら()はいらない

  15. ஫໨ͯ͠΄͍͠఺

  16. 4DBMBͰ͜Μͳͷॻ͚͚ͨͬʁ

  17. 4DBMBͰ͜Μͳͷॻ͚͚ͨͬʁ [a, b] ?

  18. 4DBMBͰ͜Μͳͷॻ͚͚ͨͬʁ [a, b] ? : のあとは
 タイプでは?

  19. 4DBMBͰ͜Μͳͷॻ͚͚ͨͬʁ [a, b] ? : のあとは
 タイプでは? {a, b} ?

  20. ίϯύΠϥ֦ுʁ

  21. ͍͍͑ɺ
 ૉͷ4DBMBͰ͢

  22. 'POU-JHBUVSF ͜Ε࣮͸…

  23. 'POU-JHBUVSF

  24. 'POU-JHBUVSF 7BMJEͳ4DBMBίʔυ

  25. 4DBMBMS w ઐ༻ϑΥϯτ4DBMJHͷར༻Λલఏͱͨ͠ίʔυΛੜ੒͢Δ w %4-ͷݟͨ໨Λࣗ༝ʹม͑ΒΕΔΑʂ΍ͬͨͶʂ w ίϯύΠϧʹ͕͔͔࣌ؒΔͷ͕ͪΐͬͱͨ͠໰୊
 ཁૉͷ+40/ͷ഑ྻͷίϯύΠϧʹ࣌ؒҎ্͔͔ͬͨ w ஍ຯʹଧͭͷ͕໘౗ͳͷͰΤσΟλαϙʔτ΋։ൃ͍ͨ͠

    w IUUQTHJUIVCDPNQIFOBOTDBMBMS
  26. ٕज़తৄࡉ w !ETM͸ΞϊςʔγϣϯϚΫϩ w JNQMJDJUQBSBNFUFSΛѱ༻ͯ͠ίϯύΠϧ࣌-"-3ߏจղੳ w ܕˠඇऴ୺ه߸ จ๏Λදݱ͢Δ΍ͭ  w

    ೚ҙͷ෦෼ࣜΛׅހͰׅͬͨ4DBMBࣜͰஔ͖׵͑Մೳʹ͢ΔͨΊʹ
 ͪΐͬͱෳࡶͳ͜ͱΛ͍ͯ͠Δ w ͜ͷख๏ΛԠ༻ͯ͠ࣈ۟ղੳΛมߋՄೳʹ͢Δ͜ͱ΋Ͱ͖Δ ͸ͣ  w ΞϯΧϯϑΝϨϯεͰ࿩ͯ͠Έ͍ͨ ͚ͲεϥΠυ͸༻ҙͯ͠ͳ͍
  27. %4-ͷ࡞Γํ w ߏจղੳثΛ࡞ΔϓϩάϥϜ"45 w ΠϯλϓϦλΛ࡞Δ"45஋

  28. %4-ͷ࡞Γํ w ߏจղੳثΛ࡞ΔϓϩάϥϜ"45 w ΠϯλϓϦλΛ࡞Δ"45஋ ؔ਺Λݺ΂͹ྑ͍͚ͩ

  29. %4-ͷ࡞Γํ w ߏจղੳثΛ࡞ΔϓϩάϥϜ"45 w ΠϯλϓϦλΛ࡞Δ"45஋ ؔ਺Λݺ΂͹ྑ͍͚ͩ ͬͪ͜ΛͲ͏͢Δ͔

  30. ໰୊Λ؆୯ʹ͢Δ w %4-ΛBCDEFʜͷΑ͏ʹॻ͘΋ͷͱ͢Δ w ϝιουݺͼग़͠PSϑΟʔϧυࢀরͷνΣΠϯ w ࣮͸͜ͷه๏΋4DBMBMS͸αϙʔτ͍ͯ͠Δ

  31. Կ͕Ͱ͖Ε͹ྑ͍͔ w ϓϩάϥϜBCDEFʜͷͦΕͧΕͷؔ਺ݺͼग़͠Λݕࠪ w ϓϩάϥϜஅยBCͷ͕࣍DͰ͋Δͷ͸ਖ਼͍͠ೖྗ͔ʁ w ΦʔτϚτϯΛ࡞Δʂ S1 S2 S3

    S4 B C D
  32. Ϋϥεͱϝιου w ঢ়ଶ4ͷͱ͖͚ͩݺ΂Δؔ਺DΛ࡞Ε͹ྑ͍ w Ϋϥε4ͷϝιουD͕4ܕͷ஋Λฦͤ͹ྑ͍ S1 S2 S3 S4 B

    C D
  33. ͜Εͩͱਖ਼نදݱ͘Β͍͔͠Ͱ͖ͳ͍ w ܾఆੑ༗ݶΦʔτϚτϯ w ΋͏গ͠ڧ͍ߏจղੳ͕͍ͨ͠ w -3ߏจղੳΛ࠶ݱ͢Δʂ S1 S2 S3

    S4 B C D
  34. -3ΦʔτϚτϯ w ܾఆੑ༗ݶΦʔτϚτϯͷࣗવͳ֦ு w SFEVDF࠷ۙಡΜ͍͔ͩͭ͘ͷτʔΫϯΛͳ͔ͬͨ͜ͱʹͯ͠ɺ
 ผͷτʔΫϯΛಡΜͩ͜ͱʹ͢Δ S1 S2 S3 S4

    &YQS 5FSN S5 /VN /VN S6 5FSN
  35. -3ΦʔτϚτϯ w ܾఆੑ༗ݶΦʔτϚτϯͷࣗવͳ֦ு w SFEVDF࠷ۙಡΜ͍͔ͩͭ͘ͷτʔΫϯΛͳ͔ͬͨ͜ͱʹͯ͠ɺ
 ผͷτʔΫϯΛಡΜͩ͜ͱʹ͢Δ SFEVDF5FSN/VN SFEVDF&YQS&YQS 5FSN S1

    S2 S3 S4 &YQS 5FSN S5 /VN /VN S6 5FSN
  36. *NQMJDJUQBSBNFUFSΛ࢖͏ʂ w 3FEVDFՄೳ͔Ͳ͏͔ΛJNQMJDJUQBSBNFUFSʹ͢Δ w 4͸4Λܦ༝ͯ͠4ʹSFEVDFՄೳͳͷͰ
 ϝιου͕ݺ΂ΔΑ͏ʹ͢Δ SFEVDF5FSN/VN SFEVDF&YQS&YQS 5FSN S1

    S2 S3 S4 &YQS 5FSN S5 /VN /VN S6 5FSN
  37. ࣮૷Πϝʔδ implicit class PlusTransition[Sn] (sn: Sn) { def plus (implicit

    reduce: SnからS2にreduce可能): S3 = { reduce(sn).plus() } } ೚ҙͷঢ়ଶ4O͸
 4ʹSFEVDFՄೳͰ͋Ε͹
 QMVTΛݺͿ͜ͱ͕Ͱ͖Δ
  38. 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[
  39. 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
  40. ຊ౰ͷ࣮૷͸΋͏গ͠ෳࡶ w -"-3ߏจղੳʹ͢ΔͨΊʹɺ
 3FEVDFՄೳ͔Ͳ͏͔ͷ൑அʹ΋࣍ͷτʔΫϯΛ࢖͏ w BCDEFʜͰ͸͕ඞཁͳͷͰɺ
 ຊ౰͸BC D E F

    ʜͷܗʹ͍ͨ͠ w ͜͏͢Ε͹BCDEFʜͷΑ͏ʹॻ͚Δʂ w CϝιουΛDΛҾ਺ʹͱΔϝιουʹͯ͠ɺ
 ͭͿΜͷঢ়ଶભҠΛҰؾʹ΍Ε͹ྑ͍
  41. ຊ౰ͷ࣮૷͸ߋʹෳࡶ 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ݸ෼ͷঢ়ଶભҠΛҰ౓ʹ΍Δ࢓૊Έ͕ඞཁ
  42. 4DBMBMS<IUUQTHJUIVCDPNQIFOBOTDBMBMS> w ࣮ଶ͸-"-3  ύʔβδΣωϨʔλ w ී௨ͷύʔβͰ͸ͳ͘JNQMJDJUWBMVF౳ͷఆٛΛੜ੒͢Δ w !ETMΞϊςʔγϣϯϚΫϩʹΑΓίϯύΠϧ࣌ʹίʔυੜ੒ w

    ϚΫϩύϥμΠε͸ϚΫϩ஍ࠈͩͥ w %4-Ϣʔβ͸JNQPSU͢Δ͚ͩͰ%4-Λ࢖͑Δʂ w ίϯύΠϧʹ͕͔͔࣌ؒΔ w -"-3͸ઢܗͷΞϧΰϦζϜ͕ͩɺ࣮ଌͩͱ0 O ͘Β͍ʹݟ͑Δ