nothing interesting
[monky] / lua_scripts / strict.lua
diff --git a/lua_scripts/strict.lua b/lua_scripts/strict.lua
new file mode 100644 (file)
index 0000000..f04505e
--- /dev/null
@@ -0,0 +1,42 @@
+--
+-- strict.lua
+-- checks uses of undeclared global variables
+-- All global variables must be 'declared' through a regular assignment
+-- (even assigning nil will do) in a main chunk before being used
+-- anywhere or assigned to inside a function.
+--
+-- From Lua distribution (etc/strict.lua)
+--
+
+local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget
+
+local mt = getmetatable(_G)
+if mt == nil then
+  mt = {}
+  setmetatable(_G, mt)
+end
+
+mt.__declared = {}
+
+local function what ()
+  local d = getinfo(3, "S")
+  return d and d.what or "C"
+end
+
+mt.__newindex = function (t, n, v)
+  if not mt.__declared[n] then
+    local w = what()
+    if w ~= "main" and w ~= "C" then
+      print("assign to undeclared variable '"..n.."'")
+    end
+    mt.__declared[n] = true
+  end
+  rawset(t, n, v)
+end
+
+mt.__index = function (t, n)
+  if not mt.__declared[n] and what() ~= "C" then
+    print("variable '"..n.."' is not declared")
+  end
+  return rawget(t, n)
+end