From a1b559a3a269bbee1ae9a33061b08a868ea52f5c Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 25 Jan 2019 15:49:29 -0800 Subject: Added metatables for bool, number, function, coroutine. Added run-time check to make sure precompiled code used the same version of Lua. Methods can now be used in (* compiles to *), etc. --- builtin_metatables.lua | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 builtin_metatables.lua (limited to 'builtin_metatables.lua') diff --git a/builtin_metatables.lua b/builtin_metatables.lua new file mode 100644 index 0000000..e579e6c --- /dev/null +++ b/builtin_metatables.lua @@ -0,0 +1,65 @@ +require("text") +local number_mt = { + __type = "a Number", + as_lua = tostring, + as_nomsu = tostring, + as_text = tostring, + as_a_number = function(self) + return self + end, + rounded = function(self) + return math.floor(self + .5) + end, + rounded_down = math.floor, + rounded_up = math.ceil, + to_the_nearest = function(self, rounder) + return rounder * math.floor(self / rounder + 0.5) + end, + base16 = function(self) + return ("%X"):format(self) + end +} +number_mt.__index = number_mt +debug.setmetatable(0, number_mt) +local bool_mt = { + __type = "a Boolean", + as_lua = tostring, + as_nomsu = function(self) + return self and "yes" or "no" + end, + as_text = function(self) + return self and "yes" or "no" + end +} +bool_mt.__index = bool_mt +debug.setmetatable(true, bool_mt) +local fn_mt = { + __type = "an Action", + as_text = function(self) + return (tostring(self):gsub("function", "Action")) + end +} +fn_mt.__index = fn_mt +debug.setmetatable((function() end), fn_mt) +local co_mt = { + __type = "a Coroutine", + as_text = function(self) + return (tostring(self):gsub("thread", "Coroutine")) + end +} +co_mt.__index = co_mt +debug.setmetatable(coroutine.create(function() end), co_mt) +local nil_mt = { + __type = "Nil", + as_lua = function(self) + return "nil" + end, + as_nomsu = function(self) + return "nil" + end, + as_text = function(self) + return "nil" + end +} +nil_mt.__index = nil_mt +return debug.setmetatable(nil, nil_mt) -- cgit v1.2.3