nick at ccl4
Aug 29, 2012, 5:48 AM
Post #1 of 4
On Fri, Aug 24, 2012 at 10:30:49AM +1000, Damian Conway wrote:
junctions (was Re: fixing smartmatch just hard enough (and when, too))
> But what about:
> is_prime( all(2,3) )
> If the junction is passed in, is_prime() returns:
> all() # i.e. false
> which is wrong...whereas the "proper" semantics of:
> all( is_prime(2), is_prime(3))
> all(1,1) # i.e. true.
> So it's perfectly possible to have a sane and reasonable semantics for
> junctions and a sane and reasonable semantics for is_prime(), that are
> not sane and reasonable when used together.
> In fact, that's why junctive arguments are supposed to distribute across
> subroutine calls, rather than be passed into them: because subroutines
> that are not specifically designed for junctive arguments generally
> break when passed junctive arguments (especially conjunctive arguments).
> In exactly the same way that subroutines not designed for complex
> numbers or surreal numbers, or matrices, or quaternions, generally don't
> work correctly when passed those kinds of values. Subroutines are coded
> assuming a particular arithmetic model, and data that doesn't follow
> those particular rules just won't work right.
Does that mean that we *ought* to be changing the calling conventions to
spot junctions on the way in and multiplex a single call into multiple
calls? This is how Perl 6 does it?
What happens if we don't change that? ie that junctions are in @_, and
a non-junction aware function is called? In what circumstances do things