On Fri, Jan 18, 2008 at 09:16:39AM -0800, Larry Wall wrote:
: Though it's not quite the same, since the prefix presumably forces
: a multiple dispatch to Perl's idea of notiness, while a direct .not
: method would rely on the the object's notion of notiness. This is
: probably a good distinction for cross-language programming.
: So I think Object should define a default .not that is defined in
: terms of .true. If a Perl class wants to override that, it's
: probably because it has a more efficient .not test, and wants to
: define .true in terms of .not instead.
It occurs to me that a foreign object might not *have* a .not method,
especially if it's not a boolean type. So I think if the foreign
language dispatch fails, it should try to redispatch to any ancestors
it thinks it has in Perl space, Object if nothing else. That would
at least allow an attempt at mapping .not to !.true. But maybe
that means that Object's definition of .not should be !true($obj) to
give P6 multis a shot at defining truth for the foreign object before
calling into the (probably non-existent) .true method on the foreign
object. I figure if it's not a boolean type, it probably won't have
either .not or .true, and P6's prefix:<true> for that type probably
needs to compare the value to 0 or "" or some such. Or maybe Object's
definition of truth can be sophisticated enough to notice foreign
influences and compensate for them. Seems like something MD would
be good at though.
All that being said, we want boolean tests to be *fast*, so since
prefix:<?> et al. have proto definitions, we probably can do some
decent inlining in lexical scopes where the set of truth multis is
known at compile time.