ククログ

株式会社クリアコード > ククログ > ノータブルコード17 - バッチファイルにLuaスクリプトを埋め込む技

ノータブルコード17 - バッチファイルにLuaスクリプトを埋め込む技

最近、WindowsでLuaRocksを動かす機会があった林です。

今回はLuaRocksのインストール用のバッチファイルを見ていて印象に残った、「バッチファイルにLuaスクリプトを埋め込む技」を紹介します。

Windows版のLuaRocksにはスタンドアローン版とレガシー版の2種類があり、この技を使っているのはレガシー版1のほうにありました。 LuaRocksのレガシー版では、install.batを実行して指定した場所にインストールするようになっています。

このバッチスクリプトの冒頭に次のような箇所がありました。

rem=rem --[[--lua
@setlocal&  set luafile="%~f0" & if exist "%~f0.bat" set luafile="%~f0.bat"
@win32\lua5.1\bin\lua5.1.exe %luafile% %*&  exit /b ]]

...(以降埋め込まれたLuaスクリプトは省略)

バッチファイルを実行した挙動としては、次のようになります。

  • 1行目のrem=rem --[[--luaはバッチファイルのコメントとして無視される
  • 2行目の@setlocal& set luafile="%~f0" & if exist "%~f0.bat" set luafile="%~f0.bat"luafileに実行中のバッチファイルのパスを設定する
  • 3行目の@win32で始まる部分でlua5.1.exeの引数としてバッチファイルのパス%luafile%を指定して実行する
  • Luaスクリプトとして実行されたrem=remrem=nilと解釈される。続く--[[で3行目の終わりの]]までをコメントとして無視する。--luaは単なるコメントの文字列。
  • それ以降はすべて埋め込んだLuaスクリプトを実行する
  • Luaスクリプトの実行が終了したら、バッチスクリプトの実行に戻る。exit /bで実行したLuaスクリプトの戻り値を得る

以上、コメントとして無視される挙動をうまく活用して「バッチファイルにLuaスクリプトを埋め込む技」が実現されていることがわかります。 この手のテクニックはPolyglotなどと呼ばれているようです。他の言語の組みあわせではどうやるのかを調べてみると面白いかもしれません。

  1. https://luarocks.github.io/luarocks/releases/luarocks-3.7.0-win32.zip