最近、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=remはrem=nilと解釈される。続く--[[で3行目の終わりの]]までをコメントとして無視する。--luaは単なるコメントの文字列。 - それ以降はすべて埋め込んだLuaスクリプトを実行する
- Luaスクリプトの実行が終了したら、バッチスクリプトの実行に戻る。
exit /bで実行したLuaスクリプトの戻り値を得る
以上、コメントとして無視される挙動をうまく活用して「バッチファイルにLuaスクリプトを埋め込む技」が実現されていることがわかります。 この手のテクニックはPolyglotなどと呼ばれているようです。他の言語の組みあわせではどうやるのかを調べてみると面白いかもしれません。