On Fri, Feb 11, 2005 at 02:12:51PM -0600, Patrick R. Michaud wrote:
> I briefly grepped through the apocalypses/synopses and couldn't
> find the answer -- how do I tell a scalar context to expect a
> junction of values?  In particular, is there a way for me to pass
> a junction to a routine without it autothreading and without having
> to bury the junction in an array or some other structure?

If you have control over that routine, argument prototypes is probably
the way to go.  To wit:

    pugs> sub myRand ($j) { rand }; (myRand(any(1,2))).perl
    "((0.33283094755206977 | 0.815772904389485))"

    pugs> sub myRand (Junction $j) { rand }; (myRand(any(1,2))).perl
    "(0.9624736987665468)"

If you don't have control over the routine, maybe taking a reference
is the way to go:

    pugs> sub myRand ($j) { rand }; $ref := \ (1|2); (myRand($ref)).perl
    "(0.5057952976799094)"

Note that "\ (1|2)" is evaluated as "ref(any(1,2))", not "any(ref(1),ref(2))".
The reason is that currently I'm prohibiting autothreading if any of the
below is true:

    * $context.isa(Bool)
    * $context.isa(Junction)
    * Any.isa($context)

Hence, because the "\" primitive has a prototype of:

    &infix:<\> (Any $x) returns Ref

Its first argument is not autothreaded.  As usual, please sanity-check
the heuristics above. :-)

Thanks,
/Autrijus/

Attachment: pgpbtYWbEyfXX.pgp
Description: PGP signature

Reply via email to