webmcp

annotate libraries/nihil/nihil.lua @ 334:ac44b171aa09

merge
author jbe
date Tue Mar 24 17:27:41 2015 +0100 (2015-03-24)
parents 3d43a5cf17c1
children
rev   line source
jbe/bsw@0 1 #!/usr/bin/env lua
jbe/bsw@0 2
jbe/bsw@0 3 local error = error
jbe/bsw@0 4 local getmetatable = getmetatable
jbe/bsw@0 5 local rawset = rawset
jbe/bsw@0 6 local setmetatable = setmetatable
jbe/bsw@0 7
jbe@64 8 local _M = {}
jbe@64 9 if _ENV then
jbe@64 10 _ENV = _M
jbe@64 11 else
jbe@64 12 _G[...] = _M
jbe@64 13 setfenv(1, _M)
jbe@64 14 end
jbe/bsw@0 15
jbe/bsw@0 16 metatable = {
jbe/bsw@0 17 __tostring = function(self)
jbe/bsw@0 18 return "nil" .. self[1]
jbe/bsw@0 19 end,
jbe/bsw@0 20 __newindex = function()
jbe/bsw@0 21 error("Objects representing nil are immutable.")
jbe/bsw@0 22 end
jbe/bsw@0 23 }
jbe/bsw@0 24
jbe/bsw@0 25 nils = setmetatable({}, {
jbe/bsw@0 26 __mode = "v",
jbe/bsw@0 27 __index = function(self, level)
jbe/bsw@0 28 if level > 0 then
jbe/bsw@0 29 local result = setmetatable({ level }, metatable)
jbe/bsw@0 30 rawset(self, level, result)
jbe/bsw@0 31 return result
jbe/bsw@0 32 end
jbe/bsw@0 33 end,
jbe/bsw@0 34 __newindex = function()
jbe/bsw@0 35 error("Table is immutable.")
jbe/bsw@0 36 end
jbe/bsw@0 37 })
jbe/bsw@0 38
jbe/bsw@0 39 function lift(value)
jbe/bsw@0 40 if value == nil then
jbe/bsw@0 41 return nils[1]
jbe/bsw@0 42 elseif getmetatable(value) == metatable then
jbe/bsw@0 43 return nils[value[1]+1]
jbe/bsw@0 44 else
jbe/bsw@0 45 return value
jbe/bsw@0 46 end
jbe/bsw@0 47 end
jbe/bsw@0 48
jbe/bsw@0 49 function lower(value)
jbe/bsw@0 50 if value == nil then
jbe/bsw@0 51 error("Cannot lower nil.")
jbe/bsw@0 52 elseif getmetatable(value) == metatable then
jbe/bsw@0 53 return nils[value[1]-1]
jbe/bsw@0 54 else
jbe/bsw@0 55 return value
jbe/bsw@0 56 end
jbe/bsw@0 57 end
jbe@64 58
jbe@64 59 return _M

Impressum / About Us