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. 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. 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. I don't think $foo.\bar() is really going to work. It doesn't fit together logically. Adding a \ after the dot seems to be saying something about the method, when you're actually saying something about the invocant. Plus, it means that you can do: $foo.bar.\baz(); And what does that mean? That thing doesn't even have a container yet. 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. Luke