Help us understand the problem. What is going on with this article?

インタプリタ無改造! Lua on Windows で shebang

More than 3 years have passed since last update.

Perl には -Sx オプションがあって、Perl を呼び出したバッチファイルそのものを、Perl スクリプトと一体化させることができました。

標準の Lua には、そういうオプションはありませんが、ちょっとした工夫で同等のものができました。

::rem:: --[[
@lua "%~f0" %1 %2 %3 %4 %5 %6 %7 %8 %9 & exit /b
]]--

print(string.format("[%s]",arg[1]))
-- vim:set ft=lua:
  • -S (PATHを検索する) のかわりに "%~f0" を使って、CMD.EXE にバッチファイルのフルパスに置換してもらう。
  • -x (バッチコマンド行を読み飛ばす)のかわりに rem と --[[コメント文]]-- を使う。

バッチファイルのラベル構文(:ラベル)と、Lua のラベル構文(::ラベル::)が似ていたのがラッキーでした。ただ、このやり方は Windows の CMD.EXE の機能に依存しているので、OS/2 や DOS では動きません。

Windows には拡張子とアプリケーションの関連付け機能があるので、別段、バッチファイルにスクリプトを組み込めてもそれほど嬉しくはありません。ですが、関連付けを予めしておかなくても済むので、static link で作成した lua.exe(あるいは NYAOS.EXE)とバッチファイル二つだけを持ち歩けばどこでも動かせるというのは、それなりに便利かと思います。

Lua 5.1 の場合

ラベル構文は Lua 5.2 から導入された文法なので、Lua 5.1 の場合は:

rem = [[
@lua "%~f0" %1 %2 %3 %4 %5 %6 %7 %8 %9 & exit /b
]]

で逃げる形になります。1行目がエコーされてしまうので、ややみっともない点は否めませんが。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした