释义 |
local p={} function p.main(frame) local parent=frame.getParent(frame) or {} local reserved_value={} local reserved_function,reserved_contents for k,v in pairs(parent.args or {}) do --if tonumber(v) then v=tonumber(v) end _G[k]=tonumber(v) or v -- transfer every parameter directly to the global variable table -- debuglog=debuglog..k.."="..v.." " end for k,v in pairs(frame.args or {}) do --if tonumber(v) then v=tonumber(v) end _G[k]=tonumber(v) or v -- transfer every parameter directly to the global variable table end --- Alas Scribunto does NOT implement coroutines, according to --- http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#string.format --- this will not stop us from trying to implement one single lousy function call if _G[1] then reserved_function,reserved_contents=mw.ustring.match(_G[1],"^%s*(%a[^%s%(]*)%(([^%)]*)%)%s*$") end if reserved_contents then local reserved_counter=0 repeat reserved_counter=reserved_counter+1 reserved_value[reserved_counter]=_G[mw.ustring.match(reserved_contents,"([^%,]+)")] reserved_contents=mw.ustring.match(reserved_contents,"[^%,]+,(.*)$") until not reserved_contents end local reserved_arraypart=_G while mw.ustring.match(reserved_function,"%.") do reserved_functionpart,reserved_function=mw.ustring.match(reserved_function,"^(%a[^%.]*)%.(.*)$") reserved_arraypart=reserved_arraypart[reserved_functionpart] end local reserved_call=reserved_arraypart[reserved_function] if type(reserved_call)~="function" then return tostring(reserved_call) elseif reserved_debug or not reserved_function then return mw.text.nowiki(debuglog) else reserved_output={reserved_call(unpack(reserved_value))} return reserved_output[reserved_return or 1] endendlocal function f0() return f() endlocal v0 = 123-- This function is modified from https://en.wikipedia.org/wiki/Module:Ustring?oldid=885619921-- All frame's arguments are coerced as number type if possible. If you wish for something to remain a string, you can simply escape it by insert \\ at the beginning of the string. function p.import(o) local p = {} for k, v in pairs(o) do p[k] = function(frame) local args = frame.args mw.log(#args) mw.log(unpack(args)) mw.logObject(args) for _, v in ipairs(args) do mw.log(_, v) args[_] = tonumber(v) or v:gsub("^\\\\", "", 1) end mw.log(#args) mw.log(unpack(args)) mw.logObject(args) return (v(unpack(args))) end end p.f0 = function (frame) return f0() end p.v0 = function (frame) return v0 end p.f = function (frame) return f() end p.v = function (frame) return v end p.f2 = function (frame) return f2() end return pendp.f0 = function (frame) return f0() endp.v0 = function (frame) return v0 endp.f = function (frame) return f() endp.v = function (frame) return v endp.f2 = function (frame) return f2() endlocal function f() endlocal v = 123--p.f0()--p.f()--p.f2()p.sub = p.import(mw.ustring).subreturn p |