【非プログラマー向け】今更ながら「タイプセーフプリキュア!」はじめプリキュア実装について紹介
プリキュア実装とは何か
掲題について数年前とあるSNSで聞かれたとき、ちゃんと説明している記事が思ったよりないことを思い出したので、自分にとってある意味名刺代わりともいえる「タイプセーフプリキュア!」を少しでも話しやすくするために書きます。「非プログラマー向け」と題しながらまぁまぁプログラマー向けの用語が登場しますが「変な世界があるもんだな」くらいに思っていただけると🙏
「プリキュア実装」とは、こちら👆の記事でまとめられている、各種のライブラリーのようなソフトウェアを指します。どんなソフトウェアなのかというと、一部例外もあります[1]が一言で言うと「プリキュアの設定を、各種プログラミング言語で書いたプログラムから簡単に利用できるようにしたソフトウェア」と言ったところでしょう。
「プリキュアの設定」とは?
ここで言う「プリキュアの設定」とは、ものによってばらつきこそありますが、共通して次の情報を備えていることが多いです:
- 各プリキュアの変身前後の名前
- 変身時のセリフや名乗り
- 代表的な必殺技(決め技、浄化技、などとも呼びます)を放つときのセリフ
- 各シリーズにどんなプリキュアがいたか
ほかにも、プリキュアを演じた声優さんの名前や各シリーズの放送期間、どんなアイテムをどのように組み合わせて変身するのか、また一般に「プリキュア」として数えられないプリキュアの情報も一部提供するなど、各プリキュア実装は各々の趣向を凝らして様々な情報を集めています。
もっと面白い機能
ただ情報を利用できるようにするだけではありません。プリキュア実装によっては、次のような変わった機能を備えていることがあります。
変身時のセリフを一行ずつ表示
変身しているときの臨場感を少しでも再現する機能です。比較的多くのプリキュア実装にあります。例えば「タイプセーフプリキュア!」だと次のような感じ:
一部のプリキュア固有の特殊なギミック
最も有名なのは、rubicureの「ピカリンジャンケン」を再現した機能でしょう:
> Cure.peace.pikarin_janken
ピカピカピカリン
ジャンケンポン!
(パー)
> Cure.peace.janken
ピカピカピカリン
ジャンケンポン!
(グー)
これは、キュアピースというプリキュアが、変身時にジャンケンをする(放送話によって出す手が異なる)ことに由来する機能です。上記は、Cure.peace
のpikarin_janken
またはjanken
というメソッド[2]を呼び出すことで、ジャンケンをするときのセリフと、キュアピースが出した手を表示したことを表します。もちろん、ジャンケンなので「(パー)」や「(グー)」と書かれた箇所はランダムに変わります。
rubicureは他にも、キュアコスモと言うプリキュアに変身する「ユニ」と言うキャラクターが、作中で様々な姿に変装して活躍していたことに由来する機能など、多くの仕掛けを取り入れた、楽しいプリキュア実装となっています。
プリキュアモナド
「タイプセーフプリキュア!」固有の変な機能です。「Haskell」という、プログラマーでも知っている人が少ないマイナーなプログラミング言語を知らないとよく分からないと思います。実は前述の「変身時のセリフを一行ずつ表示」する機能は、「タイプセーフプリキュア!」ではこの「プリキュアモナド」を利用して実装されています。詳細は英語ですが公式ドキュメントのこちらの節をご覧ください。
そこまでやって何がうれしいの?
作ること自体が楽しみ、「Just for Fun」ってやつです😏。もしプリキュア実装を使って本当の意味で実用的な例があったら教えてください!
「プログラムから簡単に利用できる」とは?
冒頭で申しました、「プリキュア実装」の一言紹介をもう少し掘り下げましょう。果たして「プログラムから簡単に利用できる」とはどういう意味なのでしょうか。
プログラマー向けには「ライブラリーのAPIや、REST APIなどを通じて実行すれば取得できるようになっています」の一言に尽きますが、ここではそれが一体どういうものなのかを簡単に説明します。
「プログラムから簡単に利用できる」ようにするためには、機械可読(machine-readable)な言語で書かれていることが必須条件です。「機械可読」であるためには、厳密に定められていて、多義的な解釈ができない文法の人工言語を用いなければなりません[3]。
例えばこちらは、「JSON」という人工言語で書かれた、キュアブラックとキュアホワイトの決め技についての情報です[4]:
{
"purifiers": [
"CureBlack",
"CureWhite"
],
"specialItems": [
"RainbowBracelets"
],
"speech": [
"希望の力よ!光の意思よ!",
"未来に向かって、突き進め!",
"プリキュア・レインボー・ストーム!!"
]
}
一部英語で書かれていて分かりづらいかも知れませんが、日本語に翻訳すると以下の情報が記載されていることが、なんとな~く読み取れるでしょうか?
- 決め技を放つ人(
purifiers
)はキュアブラック(CureBlack
)とキュアホワイト(CureWhite
)で、 - 決め技を放つのに必要なアイテム(
specialItems
)はレインボーブレス(RainbowBracelets
)で、 - 決め技を放つ時のセリフが「希望の力よ!光の意思よ!」、「未来に向かって、突き進め!」、「プリキュア・レインボー・ストーム!!」の3行である
上記のJSONは波括弧({
と}
)やダブルクォート("
)、コロン(:
)、角括弧([
と]
)など、JSONの文法に定められた各種の記号を用いることで、プログラムによる処理がしやすいよう、キュアホワイトとキュアブラックの情報を記載しています。
「JSON」のような「情報を記述するための専用の言語」は、コンピューターが実際に動作するのに必要な「どんな命令をどう実行するか」という情報を普通のプログラミング言語から取り除き、「どんな情報を処理するか(処理する対象の情報)」を書くのに特化した言語、と言えます[5]。したがって「プリキュア実装」とは、普通のプログラミング言語や、JSONなど「情報を記述するための専用の言語」で、プリキュアの情報を書いてまとめたソフトウェア、と言い換えることができます。
「タイプセーフプリキュア!」について
そんなプリキュア実装の世界に2016年に乗り込んだのが拙作の「タイプセーフプリキュア!」です。既存のプリキュア実装に対して、「タイプセーフプリキュア!」は、「設定の正確さ」を最重要視しています。
一つ具体例として、美墨なぎさと雪城ほのかが二人で一緒にプリキュアに変身するときのセリフを、一行ずつ表示するコードを上げましょう[6]:
printEpisode (transform (Nagisa, Honoka) (CardCommuneMepple, CardCommuneMipple))
これにぴったり相当するコードは、実は、私が知る限り他のプリキュア実装では実現できません。なぜなら他のプリキュア実装では、なぎさとほのかが変身するときのセリフは、それぞれ個別のプリキュアの設定として定義されているからです。
これでは、初代「ふたりはプリキュア」である二人は文字通り二人が手を繋がなければ変身できない、という設定に則れていませんし、変身シーンが「デュアル・オーロラ・ウェイブ!!」で始まって「ふたりはプリキュア!」で終わることとも矛盾しているように見えてしまいます。そこで「タイプセーフプリキュア!」では、変身時のセリフを取得する関数transform
について、なぎさとほのかが変身する場合は、その両方を受け取らなければならないようにしました。
さらに設定への忠実さを高めるため、変身アイテムについても収録しています。そう、前述のコードで言うところの(CardCommuneMepple, CardCommuneMipple)
と書いている箇所です。それぞれメップルのカードコミューンとミップルのカードコミューンを表しています。もちろんこれらもtransform
関数に渡さなければなりません。
以上の、「正しい組み合わせでなければ変身する(あるいは決め技を放つ)ことができない」という設計は、確かに正しく設定を再現する一方、 ただでさえ実用性がない上に 利用を煩雑にしてしまう、と言う問題点があります。上記の例をrubicureで再現する場合、Cure.black.transform!
やCure.white.transform!
と書くだけでよいところ、「タイプセーフプリキュア!」では妙に長ったらしいですよね?
それでもわざわざこんな変な設計にしたのは、開発にHaskellというプログラミング言語を使用したからこそです。Haskellは、強力な「型システム」という仕組みを備えており、これを活かすことで、プログラムを書いていて間違えてしまった箇所を、プログラムを実行する前に教えてくれる、という特徴があります。そんな「型システム」を始めとするHaskellの魅力的な機能[7]をいろいろ試すためにも作った「タイプセーフプリキュア!」なのです。
...がこれ以上詳しくは長くなるし難しいのでここまでにします。続きは「タイプセーフプリキュア!」を支える技術をご覧ください(こちらは非プログラマー向けではありませんが!)。
最後に、よい機会なので「タイプセーフプリキュア!」の今後についても少し。やり残したことはありますが、他にも書きたいソフトウェアがたくさんありますし、凝った機能追加や仕様変更は行わず、今後も登場するであろう新しいプリキュアのサポートや、誤字などの修正のみ行う予定です。申し訳なくもキュアフィナーレなどのサポートがまだできておりませんが、(多分)来月までお待ちを🙏!
-
件の記事で触れられている中で最も例外的なのが、拙作のyes-precure5-commandです。「【たのしいな】様々なコマンド達を何も考えずにつないで遊ぶ」という有名な記事で取り上げていただいたこともあり、こちらの方が知名度・インパクトともに高いかも知れません。こちらも併せて是非ご一読を! ↩︎
-
用語の厳密さのために「メソッド」と書きましたが、「関数」と読み換えても差し支えありません。 ↩︎
-
すごく細かい話: プリキュアの情報を搭載したSQLite製のデータベース、みたいなのは今のところ聞いたことがありませんが、ここではデータベース(のファイル)のような、一見言語っぽくないものも含めて、広い意味で「人工言語」であると考えてください。 ↩︎
-
「タイプセーフプリキュア!」のおまけであるpretty-cure-index.jsonから引用しました。pretty-cure-index.json及びcure-index.jsonについては「substring-parserで「タイプセーフプリキュア!」を移行した話」をご覧ください。 ↩︎
-
よく、「HTMLやCSSだけ書けてもプログラミングできると言えない」と言われるのも、HTMLやCSSがある種の「どんな情報を処理するか(処理する対象の情報)」の記述に特化した言語であり、それだけでコンピューターを動かすプログラムは作れないからです。 ↩︎
-
何度も初代「ふたりはプリキュア」の例を使うようで恐縮ですが、プリキュアにあまり詳しくない方にも一番通じやすいかな、と思いまして... ↩︎
-
正確には、Haskellの最も有名な処理系であるGHCの機能。 ↩︎
Discussion