[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Syntactic sugar idea: Safe use of nil
- From: Mark Hamburg <mhamburg@...>
- Date: Tue, 29 Jun 2004 20:50:11 -0700
Some clarifications. I was not proposing ? as an operator on its own. I was
proposing ?. as an operator. It doesn't matter much for a simple
dereference:
a?.b
is the same as
a and a.b
But it becomes useful for deeper references such as:
a?.b?.c
Which would be roughly equivalent to
a and a.b and a.b.c
Except that it wouldn't calculate a.b twice. It's potentially even more
useful if we are writing something like:
f()?.b
Since we probably don't want to write this as
f() and f().b
A somewhat real world example:
local indexMethod = getmetatable( t ) ?. __index
The equivalent without ?. is:
local mt = getmetatable( t )
local indexMethod = mt and mt.__index
Applying it to message send gets one an equivalent to Objective-C's ability
to send messages to nil.
a?:m()
Is almost equivalent to
a and a:m()
but the and version only returns one value whereas I would define a?:m() as
returning either nothing if a is nil or all of the results from a:m() if a
is not nil.
But as I move to send this, I read Roberto's lovely little solution that
only has the downside of creating empty tables and functions and even that
can be avoided by predefining some globals.
a?.b === ( a or {} ) . B
a?[ b ] === ( a or {} )[ b ]
f?() === ( f or function() end )()
a?:b() === ( a or { b = function() end } ):b()
-- Or use a global object that returns the empty function for all
-- lookups
That just leaves:
a:b?() -- Send b to a but don't generate an error if it is unsupported
I don't see a way to do this without explicitly saving off a somewhere as
in:
local temp = a
( temp.b or function() end )( temp )
Is this a feature I'm dying to have? No. But it is a case that I've dealt
with more often I might have expected and the solutions become a bit
obscure.
Mark