Heliodor 2020/02/24 19:08

Luaプリプロセッサ

以前もちらっと話した気がするのですが、うちではゲームに埋め込むためのスクリプトとして LUA を利用しています。
(簡単なコマンドラインツールを作るときは PYTHON ですが)
ステージ進行スクリプトとしてはもちろん、単なる INI ファイルの代わりとして使ったり、XML ファイルにプリプロセッサ機能を追加するのに使っています。

この「XML ファイルにプリプロセッサ機能を追加する」利用法について少しお話しします。


もともとデータファイルの形式としては YAML を使っていたのですが、YAML ってあまりにも人間フレンドリーになっているせいで逆に正規表現での検索がすごくやりにくいんですよね。インデントとか考慮しないといけませんし。

例えばこんな XML 形式のデータがあったとして

<Resources>
 <Texture file="player.png">
   <Sprite x="0" y="0" w="256 h="256" />
   <Sprite x="0" y="256" w="256 h="256" />
   <Sprite x="0" y="512" w="256 h="256" />
   <Sprite x="0" y="768" w="256 h="256" />
 </Texture>
</Resources>

これの YAML 版はこんな感じになると思うのですが、

Resources:
 Texture:
  file: "player.png"
  sprites:
   - {x: 0, y: 0, w: 256, h: 256}
   - {x: 0, y: 256, w: 256, h: 256}
   - {x: 0, y: 512, w: 256, h: 256}
   - {x: 0, y: 768, w: 256, h: 256}

後者って何かのミスでインデントを解除して保存とかやっちゃうと、もうファイルを見ただけでは間違いが分からなくなってしまうんですよ。

XMLだと行頭のスペースをうっかり削除しても、カッコを消してしまってもある程度自力で復元できますからね。
あと、いつも思うのはコメントアウトの怖さです。インデントを2文字とか短めに設定していると特にそうなんですが、

Resources:
Texture:
  file: "player.png"
# sprites:
#  - {x: 0, y: 0, w: 256, h: 256}
#  - {x: 0, y: 256, w: 256, h: 256}
#  - {x: 0, y: 512, w: 256, h: 256}
#  - {x: 0, y: 768, w: 256, h: 256}
(注:こんなのコピペする人居ないと思いますが「#」はCi-enの仕様上使うとややこしいので全角になっています)

こういうコメントアウトの仕方をしていた時に、素直に#を削除すると

Resources:
Texture:
  file: "player.png"
 sprites:
  - {x: 0, y: 0, w: 256, h: 256}
  - {x: 0, y: 256, w: 256, h: 256}
  - {x: 0, y: 512, w: 256, h: 256}
  - {x: 0, y: 768, w: 256, h: 256}

みたいになるんですよ。あるあるですね。
この場合インデントの位置がそろってなくてエラーになると思うのですが、はたして右に移動してインデントを揃えるべきか、左に移動して揃えるべきか、ぱっと見だとよく分からないんですよね。
インデントがもっと深くなっていたり、インデントの頭が何百行も上の方にあったりすると大混乱します。

ここで揃え方を間違えて

Resources:
Texture:
  file: "player.png"
sprites:
 - {x: 0, y: 0, w: 256, h: 256}
 - {x: 0, y: 256, w: 256, h: 256}
 - {x: 0, y: 512, w: 256, h: 256}
 - {x: 0, y: 768, w: 256, h: 256}

みたいにしてしまうと全く意味が変わってきますからね。

そんなわけで YAML あかんわ……となって XML に帰ってきたわけです。
YAML に比べて冗長な情報が多い分だけ安心感があります。


……とはいうものの。
やっぱりタイプ量が多いと面倒なんですよね。

C/C++ のプリプロセッサみたいなのを XML テキストにも適用できないかなあと思っていたのですが、たまたま見つけた LUA によるプリプロセッサが使えそうだったんで、使わせてもらいました。

http://lua-users.org/wiki/SimpleLuaPreprocessor

これを使うと PHP の LUA 版のような事ができます。
例えば上の例にあった

<Texture file="player.png">
  <Sprite x="0" y="0" w="256 h="256" />
  <Sprite x="0" y="256" w="256 h="256" />
  <Sprite x="0" y="512" w="256 h="256" />
  <Sprite x="0" y="768" w="256 h="256" />
</Texture>

というXMLは、以下のように書き換えることができます

<Texture file="player.png">
#for i=0, 3 do
  <Sprite x="0" y="$(256*i)" w="256 h="256" />
#end
</Texture>

行頭が# で始まる部分を lua スクリプトとみなして実行、
$(...) となっている部分の中身はそのまま lua の式として実行して、評価結果で置換する、というものです。

そもそも XML を手書きでつくらずにツールとか使えばよいのでは……という気がしなくもないのですが、なんだかんだいってテキストエディターが一番融通が利いて便利なんですよ。
どんなに古いノートPCでもテキストエディタが起動しないとか重くて使えないってことはないですしね!HAHAHA……。そろそろまともなノートに買い換えたい。


というわけでフォロワー特典はそのサンプル的なものです。

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

【 500円 】プラン以上限定 支援額:500円

このバックナンバーを購入すると、このプランの2020/02に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索