$30 off During Our Annual Pro Sale. View Details »

Scalalr

 Scalalr

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

Kazuhiro Ichikawa

March 17, 2018
Tweet

More Decks by Kazuhiro Ichikawa

Other Decks in Programming

Transcript

  1. 4DBMBMS
    4DBMBͷݴޠػߏΛѱ༻ͯ͠

    ࠷ڧͷ%4-Λ࡞ΔϥΠϒϥϦ
    !QIFOBO
    4DBMB.BUTVSJൃදࢿྉ

    View Slide

  2. • Twitter: @phenan
    • Github: phenan
    • ࠓ೔ͷ࿩: ໘ന͍ϥΠϒϥϦΛ࡞ͬͨͷͰ঺հ͠·͢
    • ͜ͷεϥΠυ: https://speakerdeck.com/phenan/scalalr

    View Slide

  3. ͜Μͳײ͡Ͱ%4-Λఆٛ͢Δ

    View Slide

  4. JValue

    のDSL

    View Slide

  5. JValue

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

    View Slide

  6. JValue

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

    View Slide

  7. JValue

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. ׅހ͕͍ͬͺ͍͋Δ

    View Slide

  13. ׅހ͸ݴޠͷڥքΛ͋ΒΘ͢
    JSON DSLに

    Scala value

    をわたしている

    View Slide

  14. ׅހ͸ݴޠͷڥքΛද͢
    Scalaに

    JSON DSLを

    わたしている
    1ライナーのDSLなら()はいらない

    View Slide

  15. ஫໨ͯ͠΄͍͠఺

    View Slide

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

    View Slide

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

    View Slide

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

    タイプでは?

    View Slide

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

    タイプでは?
    {a, b} ?

    View Slide

  20. ίϯύΠϥ֦ுʁ

    View Slide

  21. ͍͍͑ɺ

    ૉͷ4DBMBͰ͢

    View Slide

  22. 'POU-JHBUVSF
    ͜Ε࣮͸…

    View Slide

  23. 'POU-JHBUVSF

    View Slide

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

    View Slide

  25. 4DBMBMS
    w ઐ༻ϑΥϯτ4DBMJHͷར༻Λલఏͱͨ͠ίʔυΛੜ੒͢Δ
    w %4-ͷݟͨ໨Λࣗ༝ʹม͑ΒΕΔΑʂ΍ͬͨͶʂ
    w ίϯύΠϧʹ͕͔͔࣌ؒΔͷ͕ͪΐͬͱͨ͠໰୊

    ཁૉͷ+40/ͷ഑ྻͷίϯύΠϧʹ࣌ؒҎ্͔͔ͬͨ
    w ஍ຯʹଧͭͷ͕໘౗ͳͷͰΤσΟλαϙʔτ΋։ൃ͍ͨ͠
    w IUUQTHJUIVCDPNQIFOBOTDBMBMS

    View Slide

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

    w ೚ҙͷ෦෼ࣜΛׅހͰׅͬͨ4DBMBࣜͰஔ͖׵͑Մೳʹ͢ΔͨΊʹ

    ͪΐͬͱෳࡶͳ͜ͱΛ͍ͯ͠Δ
    w ͜ͷख๏ΛԠ༻ͯ͠ࣈ۟ղੳΛมߋՄೳʹ͢Δ͜ͱ΋Ͱ͖Δ ͸ͣ

    w ΞϯΧϯϑΝϨϯεͰ࿩ͯ͠Έ͍ͨ ͚ͲεϥΠυ͸༻ҙͯ͠ͳ͍

    View Slide

  27. %4-ͷ࡞Γํ
    w ߏจղੳثΛ࡞ΔϓϩάϥϜ"45
    w ΠϯλϓϦλΛ࡞Δ"45஋

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    ผͷτʔΫϯΛಡΜͩ͜ͱʹ͢Δ
    S1 S2 S3 S4
    &YQS 5FSN
    S5
    /VN /VN
    S6
    5FSN

    View Slide

  35. -3ΦʔτϚτϯ
    w ܾఆੑ༗ݶΦʔτϚτϯͷࣗવͳ֦ு
    w SFEVDF࠷ۙಡΜ͍͔ͩͭ͘ͷτʔΫϯΛͳ͔ͬͨ͜ͱʹͯ͠ɺ

    ผͷτʔΫϯΛಡΜͩ͜ͱʹ͢Δ
    SFEVDF5FSN/VN
    SFEVDF&YQS&YQS5FSN
    S1 S2 S3 S4
    &YQS 5FSN
    S5
    /VN /VN
    S6
    5FSN

    View Slide

  36. *NQMJDJUQBSBNFUFSΛ࢖͏ʂ
    w 3FEVDFՄೳ͔Ͳ͏͔ΛJNQMJDJUQBSBNFUFSʹ͢Δ
    w 4͸4Λܦ༝ͯ͠4ʹSFEVDFՄೳͳͷͰ

    ϝιου͕ݺ΂ΔΑ͏ʹ͢Δ
    SFEVDF5FSN/VN
    SFEVDF&YQS&YQS5FSN
    S1 S2 S3 S4
    &YQS 5FSN
    S5
    /VN /VN
    S6
    5FSN

    View Slide

  37. ࣮૷Πϝʔδ
    implicit class PlusTransition[Sn] (sn: Sn) {
    def plus (implicit reduce: SnからS2にreduce可能): S3 =
    { reduce(sn).plus() }
    }
    ೚ҙͷঢ়ଶ4O͸

    4ʹSFEVDFՄೳͰ͋Ε͹

    QMVTΛݺͿ͜ͱ͕Ͱ͖Δ

    View Slide

  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[

    View Slide

  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&YQS5FSN
    S1 S2 S3 S4
    &YQS 5FSN
    S5
    /VN /VN
    S6
    5FSN

    View Slide

  40. ຊ౰ͷ࣮૷͸΋͏গ͠ෳࡶ
    w -"-3ߏจղੳʹ͢ΔͨΊʹɺ

    3FEVDFՄೳ͔Ͳ͏͔ͷ൑அʹ΋࣍ͷτʔΫϯΛ࢖͏
    w BCDEFʜͰ͸͕ඞཁͳͷͰɺ

    ຊ౰͸BC D
    E F
    ʜͷܗʹ͍ͨ͠
    w ͜͏͢Ε͹BCDEFʜͷΑ͏ʹॻ͚Δʂ
    w CϝιουΛDΛҾ਺ʹͱΔϝιουʹͯ͠ɺ

    ͭͿΜͷঢ়ଶભҠΛҰؾʹ΍Ε͹ྑ͍

    View Slide

  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ݸ෼ͷঢ়ଶભҠΛҰ౓ʹ΍Δ࢓૊Έ͕ඞཁ

    View Slide

  42. 4DBMBMS
    w ࣮ଶ͸-"-3
    ύʔβδΣωϨʔλ
    w ී௨ͷύʔβͰ͸ͳ͘JNQMJDJUWBMVF౳ͷఆٛΛੜ੒͢Δ
    w !ETMΞϊςʔγϣϯϚΫϩʹΑΓίϯύΠϧ࣌ʹίʔυੜ੒
    w ϚΫϩύϥμΠε͸ϚΫϩ஍ࠈͩͥ
    w %4-Ϣʔβ͸JNQPSU͢Δ͚ͩͰ%4-Λ࢖͑Δʂ
    w ίϯύΠϧʹ͕͔͔࣌ؒΔ
    w -"-3͸ઢܗͷΞϧΰϦζϜ͕ͩɺ࣮ଌͩͱ0 O
    ͘Β͍ʹݟ͑Δ

    View Slide