[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: RE: Metatables
- From: Eric Tetz <erictetz@...>
- Date: Fri, 8 Mar 2002 11:31:05 -0800 (PST)
Well, I've found a situation for which my 'proxy' object cannot help: operator ==. In the
previously mentioned language (FOOBAR) we can have:
if state == 0 then
state = state + 1
end
Where 'state' need not exist before the boolean expression. If it doesn't exist, it is created
and initialized to zero, so this boolean would evaluate to true.
Without a 'metaevent' for ==, I don't know what to do. The proxy gets me 99% of the way there,
but without this last 1% I'll be forced to use plan B. Plan B is to analyze the FOOBAR source,
trying to guess which variables in which expressions are not initialized. This will be impossible
to do with 100% accuracy, because FOOBAR variables are all global, and the order in which a
project's scripts are run is non-deterministic (event driven). Is 'state = 10' the first-time
initialization of 'state'? It depends on whether the script containing this line executes before a
script that uses 'state' in an expression.
Anyway, any ideas are welcome. I've reposted the proxy code I'm using below.
Cheers,
Eric
-- proxy.lua
local
proxy_toval,
proxy_tonum,
proxy_tostr,
proxy_metatable
function proxy_toval(p,val)
if type(p) == "table" and metatable(p) == proxy_metatable then
setglobal (p.name, val)
return val
else
return p
end
end
function proxy_tonum(p)
return proxy_toval(p,0)
end
function proxy_tostr(p)
return proxy_toval(p,"")
end
proxy_metatable = {
add = function(l,r) return proxy_tonum(l) + proxy_tonum(r) end,
sub = function(l,r) return proxy_tonum(l) - proxy_tonum(r) end,
mul = function(l,r) return proxy_tonum(l) * proxy_tonum(r) end,
div = function(l,r) return proxy_tonum(l) / proxy_tonum(r) end,
pow = function(l,r) return proxy_tonum(l) ^ proxy_tonum(r) end,
unm = function(o) setglobal(o.name, 0) return 0 end,
concat = function(l,r) return proxy_tostr(l)..proxy_tostr(r) end,
settable = function(t,k,v)
local nt = {}
rawset (nt, k, v)
setglobal (t.name, nt)
end,
}
metatable (
globals(), {
index = function(t,k)
local proxy = { name = k }
metatable (proxy, proxy_metatable)
rawset (t, k, proxy)
return proxy
end,
})
__________________________________________________
Do You Yahoo!?
Try FREE Yahoo! Mail - the world's greatest free email!
http://mail.yahoo.com/