luasubによって定義された命令の引数を簡単に取得する

argument.lua

-- argument.lua
-- luasubによってNScripter側から呼び出された後、lua側でその引数を簡単に取得できる専用の関数を作る関数。

do
	local method_list = {}
	method_list.int    = NSPopInt
	method_list.str    = NSPopStr
	method_list.intref = NSPopIntRef
	method_list.strref = NSPopStrRef
	method_list.label  = function() return "*"..NSPopLabel() end
	method_list.id     = NSPopID

	local error_check = function(k)
		if method_list[k] then return end
		NSOkBox(k.."は有効な引数型ではありません。", "ArgsCheck")
		NSEnd()
	end

	local mtc = {}

	mtc.__index = function(t, k)
		error_check(k)
		rawset(t, 1+#t, method_list[k])
		return t
	end

	mtc.__call = function(t)
		local res = {}
		for i=1, #t do
			res[1+#res] = rawget(t, i)()
			if NSCheckComma() then NSPopComma() else break end
		end
		return unpack(res)
	end
	
	mtc.__newindex = function(t, k, v)
		NSOkBox("代入はできません。", "Args1")
		NSEnd()
	end

	local mt = {}

	mt.__index = function(t, k)
		error_check(k)
		return setmetatable({
			method_list[k]
		}, mtc)
	end

	mt.__newindex = function(t, k, v)
		NSOkBox("代入はできません。", "Args0")
		NSEnd()
	end

	Args = setmetatable({}, mt)
end

使い方

Argsと言うグローバル変数を使い、それにメソッドを追加することで引数を返す関数を作成する。
00.txtで、

luasub sample
;(中略)
sample 100,"文字列",%150,$200,*label,id

lua側で

function NSCOM_sample()
	local arg = {Args.int.str.intref.strref.label.id()}
	NSOkBox(
		tostring(arg[1])..","..arg[2]..","..tostring(arg[3])..","..
		tostring(arg[4])..","..arg[5]..","..arg[6],
		"arg"
	)
end

Argsの後に、.でつなげて、int/str/intref/strref/label/idの六種類のトークンを任意の数だけ並べると、その順番で引数を取ってくる専用の関数を返す。

local get_arg = Args.int.str.intref.strref.label.id -- 関数が戻ってくる。
local args = {get_arg()} -- 関数を実行して引数を取得する。

注意点

  • 途中でそれまでに取得した値を見て次に取得する値を変えるような芸当はできませんでした。
  • 要求した引数に比べて呼び出された引数が少なければ、その分はnilになります。