substring-parserでcure-index.jsonを移行した話

Yuji Yamamoto (山本悠滋)

2018/08/18 プリキュアハッカソン NewStage

はじめまして! (^-^)

宣伝 hask(_ _)eller

今日のテーマ

「タイプセーフプリキュア!」とは?

「タイプセーフプリキュア!」とは?

軽いデモ

$ stack exec ghci -- -interactive-print="Text.Show.Unicode.uprint"
> import ACME.PreCure
> printEpisode $ transform (Mirai, Liko) (Mofurun LinkleStoneDia)

cure-index.json とは?

詳しくはこっち👇に書きましたがここでも軽く紹介

https://haskell.jp/blog/posts/2017/typesafe-precure2.html

cure-index.json とは?

修正前のcure-index.jsonの問題点

🔴修正の書式

👇こんな感じのTypes.hsがたくさん

data CureMiracle = CureMiracle deriving (Eq, Show)

transformedInstance
  [t| CureMiracle |]
  cureName_Miracle
  introducesHerselfAs_Miracle
  variation_Dia

🔴修正の書式

👇こんな感じのWords.hsがたくさん

cureName_Miracle = "キュアミラクル"
introducesHerselfAs_Miracle = "ふたりの奇跡!キュアミラクル!"
variation_Dia = "ダイヤスタイル"

🔴修正の書式

🔴修正の書式

🔵修正の書式

👇こんな感じのProfiles.hsがたくさん

mkTransformee
  "Cure Miracle"
  ""
  cureName_Miracle
  variation_Dia
  introducesHerselfAs_Miracle

※Words.hsについては面倒なので書き換えはせず

🔵修正の書式

加えて👇こんな感じのファイルがたくさん

{-# ANN module transformees #-}
$(declareTransformees transformees)

🔵修正の書式

修正前との重要な違い:

どうやって修正する?

パーサーコンビネーターとは

パーサーコンビネーターの例

おことわり hask(_ _)eller

パーサーコンビネーターの例

10進数の文字列を受け取って、整数を返すパーサー

> parse digits "123abc"
(123, "abc")

パーサーコンビネーターの例

文字 カンマ , を受け取って、そのまま返すパーサー

> parse (char ',') ",aaa"
(',' , "aaa")

パーサーコンビネーターの例

以上を組み合わせて、
10進数の文字列を受け取った後、カンマを受け取り、整数を返すパーサー
を作る

> digitsAndComma = do
    n <- digits
    char ','
    return n
> parse digistsAndComma "123,abc"
(123, "abc") -- 結果にカンマが含まれてない点に注意

パーサーコンビネーターの例

manyを使って、
10進数の文字列を受け取った後、カンマを受け取り、整数を返すパーサー
から、
カンマで区切られたたくさんの整数のリストを返すパーサー
を作る

parse (many digistsAndComma) "12,34,56,"
([12, 34, 56], "")

👍パーサーコンビネーターが正規表現より良いところ

👎パーサーコンビネーターが正規表現より悪いところ

👎パーサーコンビネーターが正規表現より悪いところ(続き)

👎先頭からのマッチしかできない

👎先頭からのマッチしかできない(続き)

👎先頭からのマッチしかできない(続き)

👎先頭からのマッチしかできない(続き)

今回の目的では

そこで!

任意のパーサーコンビネーターを
文字列の中間でも
マッチするよう変換するライブラリーを作りました!

基本的な仕組み

結果、できたこと

こちらのコミット時点のパーサーで、
同時点のTypes.hsから、
cure-indexで使用するGirlという型の値を取り出します!

stack build :migrate2cure-index
stack exec migrate2cure-index

結果、できたこと

次のゴール

まとめ