aboutsummaryrefslogtreecommitdiff
path: root/builtin_metatables.lua
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2019-01-25 15:49:29 -0800
committerBruce Hill <bruce@bruce-hill.com>2019-01-25 15:50:51 -0800
commita1b559a3a269bbee1ae9a33061b08a868ea52f5c (patch)
tree51f2368c6542efe47dd2a4007ba92e22650236b9 /builtin_metatables.lua
parent1713a0e38f12f8ed167575ac5a84a0eb8dd59a44 (diff)
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.
Diffstat (limited to 'builtin_metatables.lua')
-rw-r--r--builtin_metatables.lua65
1 files changed, 65 insertions, 0 deletions
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)