169 lines
3.0 KiB
Lua
Executable File

-- shared_meters = true
keep_ambiguous = true
require 'unclasslib'
function say(msg) print(msg and "> " .. msg or "") end
print [[
> meter = class()
> function meter:__init(value)
> print("meter init " .. (value or 'nil'))
> self.value = value or 0
> end
> function meter:set(value)
> self.value = value
> end
> function meter:read()
> print("meter read " .. self.value)
> return self.value
> end
> function meter:which()
> print("meter = " .. tostring(self) .. " { value = " .. self.value .. " }")
> end
> meter.value = -1
]]
meter = class()
function meter:__init(value)
print("meter init " .. (value or 'nil'))
self.value = value or 0
end
function meter:set(value)
self.value = value
end
function meter:read()
print("meter read " .. self.value)
return self.value
end
function meter:which()
print("meter = " .. tostring(self) .. " { value = " .. self.value .. " }")
end
meter.value = -1
m = shared_meters and shared(meter) or meter
mm = shared_meters and "shared(meter)" or "meter"
say("hygro = class(" .. mm .. ")")
hygro = class(m)
print [[
> function hygro:read()
> print("humidity " .. self[meter].value)
> end
]]
function hygro:read()
print("humidity " .. self[meter].value)
end
say("therm = class(" .. mm .. ")")
therm = class(m)
print [[
> function therm:read()
> print("temperature " .. self[meter].value)
> end
]]
function therm:read()
print("temperature " .. self[meter].value)
end
print [[
> hygrotherm = class(hygro, therm)
> function hygrotherm:read()
> self[hygro]:read()
> self[therm]:read()
> end
]]
hygrotherm = class(hygro, therm)
function hygrotherm:read()
self[hygro]:read()
self[therm]:read()
end
say('ht = hygrotherm(0)')
ht = hygrotherm(0)
say()
say("ht[therm]:set(11)")
ht[therm]:set(11)
say("ht[therm]:read()")
ht[therm]:read()
say()
say("ht[hygro]:set(22)")
ht[hygro]:set(22)
say("ht[hygro]:read()")
ht[hygro]:read()
say()
say("ht[therm]:read()")
ht[therm]:read()
say()
say("ht:read()")
ht:read()
say()
say("ht:which()")
status, msg = pcall(ht.which, ht)
if not status then print(msg) end
function show(t)
if not t or not t.__type then print("Sorry, cannot show " .. tostring(t)) return end
print('__type', t.__type)
for i, v in pairs(t) do
if type(i) ~= 'string' or i:sub(1, 2) ~= '__' then print(i, v) end
end
end
print()
print("Class attributes:")
print()
print('meter:') show(meter)
print()
print('therm:') show(therm)
print()
print('hygro:') show(hygro)
print()
print('hygrotherm:') show(hygrotherm)
print()
print("ht is a meter = ", ht:is_a(meter))
print("ht is a therm = ", ht:is_a(therm))
print("ht is a hygro = ", ht:is_a(hygro))
print("ht is a hygrotherm = ", ht:is_a(hygrotherm))
print()
print("Object attributes:")
print()
print("ht:") show(ht)
print()
print("ht[hygro]:") show(ht[hygro])
print()
print("ht[therm]:") show(ht[therm])
print()
print("ht[hygro][meter]:") show(ht[hygro][meter])
print()
print("ht[therm][meter]:") show(ht[therm][meter])
print()
print("ht[meter]:")
status, msg = pcall(show, ht[meter])
if not status then print(msg)end