On Sat, Dec 04, 2004 at 10:25:49AM -0700, Luke Palmer wrote:
: Ashley Winters writes:
: > For several reasons, that doesn't work for me. The method conflict
: > between container methods and value methods should be obvious. What
: > should ((1|2)|(3&4)).values return?
: 
: Well, there is an answer, and it's one I've never been extremely happy
: with.  That is, Junctions delegate everything to their junctands
: *except* a small set of methods.  .values is one of those.  So:
: 
:     ((1|2)|(3&4)).values  returns  (1|2), (3&4)
: 
: And you can call values on each of those to get the others out.
: 
: In my proposal "The Object Sigil", I attempted to get around this
: problem for both Junctions and iterators, using a syntactic convention.
: I later realized that you could do this with just one method.
: Presumably this method would be called the same thing for everything,
: let's say .val.
: 
: Then:
: 
:     ((1|2)|(3&4)).values           returns
:     ((1|2).values | (3&4).values)  which returns
:     (1.values | 2.values) | (3.values & 4.values)  which is an error
: 
: So instead you'd use:
: 
:     ((1|2)|(3&4)).val.values
: 
: You can see why I wanted syntactic support.
: 
: But this convention provides much more accuracy than memorizing a list
: of methods that don't automatically thread, or memorizing a list of
: iterator methods that act on the iterator and not its current value.

Except that you don't actually have to memorize a list.  Methods thread
on their invocant only if their invocant isn't a Junction.  Its
mnemonic value is no better or worse than any other MMD distinction.

: That is:
: 
:     for @foo -> $i {
:         $i.next;     # call .next on the current value in @foo
:         $i.val.next; # call .next on the iterator
:         
:         # let's say @foo is a list of iterators!
:         $i.next;     # call .next on the value pointed to by the iterator in 
@foo
:         $i.val.next; # call .next on the iterator $i
:         $i.val.deref.val.next;  # call .next on the iterator in @foo
:     }
: 
: Yeah, the last one is a mouthfull, but let's see you do that *at all*
: with the other semantics.

We can't have semantics where an object keeps track of what container
it's in.  What if it's in more than one container?

The only reason a tied()-like operator works is that it's not really
a run-time operator at all.

: Anyway, there's something to think about.  Moving on...
: 
: > The answer is simple enough: for scalar container method calls, use
: > $foo.\bar(), which would be syntactic sugar for (\$foo).bar, and would
: > be the Perl6 equivalent to the Perl5 idiom tied($foo)->bar()
: 
: Er, hmm.  See, that doesn't solve your junction problem.  Junction is a
: value, and it's different from the scalar container it goes in.
: 
: Differentiating method calls on arrays and hashes and on their values is
: easy:
: 
:     @array.sort;
:     @array[0].sort;
: 
: It's scalars which are the problem.  /A1?2/ said that you actually do
: use:
: 
:     tied($foo).bar;
: 
: So, well, there you go.  

Except that S12 currently has that as var() instead of tied().

: It'd be nice to have some nicer way than tied($foo).bar, though.  I
: think we should see how often it comes up in the real world (or the
: theoretical world) before we jump to adding a new operator on it.

Agreed.

Larry

Reply via email to