[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: More on environments and objects
- From: Chris Marrin <chris@...>
- Date: Sat, 27 Aug 2005 07:58:08 -0700
Rici Lake wrote:
...
Just to harp on another issue, I was very proud when I overrode all
the arithmetic opcodes to be able to handly my "primitive objects". My
system has objects, for instance SFFloat, which are wrappers around
primitives (float in this case). If I have:
local a = SFFloat(1)
I really want to go:
local b = a + 5
So I overrode __add and simply converted the object to a primitive,
did the add and returned the result.
I can't help thinking that it would be easier to convert the SFFloats to
numbers when you introduce them into the Lua environment, and back to
SFFloats when you export them. Again, this could easilly be done with
getter/setter methods.
The whole point of having objects represent primitives is because they
have extra functionality, like firing events which can be routed to
properties of other objects. So Lua really needs to know about their
object-ness. And the whole point of making this author-friendly is to
avoid getter and setter methods.
Cool! Well, when I overrode __lt so I could do this:
if a < 5 then ...
it didn't work because the logic around __lt requires that both sides
of the operator are the same type!
Actually, it only requires them to have the same metamethod. In Lua 5.1,
primitive types have metatables, so you could define the __lt metamethod
for Lua numbers to be the same metamethod as your Numeric types. This
wouldn't slow down Lua's actual numeric comparisons since the Number
metatable isn't consulted. Having said that, I haven't checked the code
to see whether that will work -- it may be that Lua still insists that
comparable objects have the same Lua type -- but the patch would be a
lot cleaner.
Right, I have thought that the new primitive metatables might help me.
But I have not fiddled with them yet.
...
It would be nice if there were __toboolean and __tonumber
metamethods, just like there is __tostring.
This wouldn't really work in the case of __tonumber; you would have to
restrict it to the tonumber() explicit coercion.
Suppose you had a + b
where a and b are objects. Does this mean
meta(a):__tonumber(a) + meta(b):__tonumber(b)
or
meta(a):__add(b)
(Consider the case of a Complex object type to put that into perspective.)
Couldn't you have a rule that first tried the first way and if that did
not work (because there is not __tonumber metamethod for that object,
for instance) you would try __add? I agree that __add is needed for
things like complex numbers. I don't happen to have that issue, though.
...
Anyway, that didn't happen and I'm not really disappointed. (I'd still
be happy to go back to only 'nil' testing false, though.) One of the
things I really like about Lua is that 0 and "0" and {} are all true.
(Particularly "0".) If you mean something different you should say it.
I was pissed off at first that 0 tested true in Lua. I've never seen
another mainstream language that does this. But I am not too mad about
it. I have no problem forcing my authors to do:
if a == 0 then ...
I have had to resort to a valueOf() method on these objects. So you
have to go:
if c:valueOf() then ...
not bad, but not very friendly to the authors either!
Friendly to the authors would be not trying to wrap true and false as
pseudo-objects, or using the 5.1 metatables to do so. Failing that, I'd
go for:
if c == SFTrue then ...
or
if c ~= SFFalse then
or even
if Boolean(c) then
But for all intents and purposes an SFBoolean object IS a boolean
primitive. The extra features that SFBoolean provides has nothing to do
with its data type, only with how it can interact with other properties
in the system. What I really want is for Lua not to judge me for how I
want to coerce the object system :-)
in preference to c:valueOf(), which doesn't give me much of a hint what
it's supposed to do.
This brings up what seems to be a dirty word here and many other
language oriented places, Javascript. I say that because I see people
all over the place mention the "top languages" as Python, C++, Java,
event Self (which I have taken to be a codeword for Javascript). I'm not
sure why that it. Is it because Javascript has been erroneously
associated with Java by its poor naming, or is it because people don't
like to type ECMAScript, or is it because it has to much of the cachet
of that other persona non grata language, Basic? It's almost like saying
Voldemort in the Harry Potter books! But it is one of the most popular
languages in existance, given the millions of web pages it appears on.
Anyway, many of these concepts come from
The-Language-That-Must-Not-Be-Named.
In particular, valueOf() returns a string, number or boolean primitive
if the object is naturally of that type. Otherwise it returns the object
that was passed. It is used to solve this exact problem. It is hardly
ever used in Javascript because it does all these transformations
implicitly.
Anyway, my goal is to get as many Javascript features into the Lua-based
Object Model as possible. I am even considering writing a
Javascript-to-Lua translator so my authors can use that syntax. That
will solve the "Lua is just too oddball" complaint I am getting. This
solution may not provide as rich a solution as Lua is capable of. But
native Lua will still be there when needed so nothing will be lost!
--
chris marrin ,""$, "As a general rule,don't solve puzzles
chris@marrin.com b` $ that open portals to Hell" ,,.
,.` ,b` ,` , 1$'
,|` mP ,` :$$' ,mm
,b" b" ,` ,mm m$$ ,m ,`P$$
m$` ,b` .` ,mm ,'|$P ,|"1$` ,b$P ,` :$1
b$` ,$: :,`` |$$ ,` $$` ,|` ,$$,,`"$$ .` :$|
b$| _m$`,:` :$1 ,` ,$Pm|` ` :$$,..;"' |$:
P$b, _;b$$b$1" |$$ ,` ,$$" ``' $$
```"```'" `"` `""` ""` ,P`