On Fri, May 06, 2005 at 06:35:45PM +0200, Juerd wrote:
: Which things can receive?
: 
: If I recall things correctly, we already have these:
: 
:     sub     # slurpy list
:     arrary  
:     hash
: 
: Would it make sense to add, for example,
: 
:     filehandle  # write
: 
: It may not, as it's not reversible like the others are: a filehandle in
: list context doesn't slurp. It's probably better to let this be done
: only with io().

That's one of the reasons io() is so Huffmanly short, I imagine.

: When piping to a scalar, I assume its reftype will determine what will
: happen. But what if the scalar is undef? Is it then assumed to want to
: behave like an array?

How does it autovivify, in other words?  Maybe it autovivifies to
an iterator:

    do_stuff() ==> my $iter;

    for =$iter {...}

If someone wants to use an array, I don't see why they wouldn't just use @.

: When is the pointy side evaluated?

Whenever it asks for more data, and more data is available.

: How do you pipe to an array returned by a sub? ==> @ foo()?

    ==> foo()[]

That'd work for

    ==> $foo[]

as well, presumably, and autovivify an array in $foo.

We probably ought to consider the parallel aspects of piping to a hash,
since there's no requirement that a hash be built in order.  With the
recent change to allow multiple input pipes, the pipes could probably
be run in parallel:

    my %result <== [<==] @pairgenerators;
    my %result{()} = 1 <== [<==] @keygenerators;

Actually that wouldn't work, since %result <== @a <== @b implies that
@b passes through @a on its way to %result.  Maybe I mean something
more like:

    my %result »<==« @pairgenerators;
    my %result{()} = 1 »<==« @keygenerators

But actually, %result <== @a <== @b doesn't imply passage through
@a unless <== is right associative like assignment.  If it's left
associative, it means (%result <== @a) <== @b, which can probably be
parallelized, just like @b ==> %result <== @a, and any other constructs
that can be borrowed from the B*f* class of languages.

I suppose ==> is left associative, which means that 

    @a ==> foo() ==> %result

does go through foo().  But that probably means

    %result <== foo() <== @a

really wants to be right associative, which means we can't reduce with
it.  However, we just got through saying that ; is basically equivalent
to <==.  But ; could be construed as left associative, so maybe we can
say it like this:

    my %result <== [;] @pairgenerators;
    my %result{()} = 1 <== [;] @keygenerators;

Interestingly, reduction with [;] works at the top level and can't
be confused with statement-final semicolon.

So if we want to parallize input pipes, we just bind to Lazy *array
and arrange to read whichever lazy list has something for us.  Probably
need some kind of internal support for that.  Maybe any(@array).shift can
do it.

: Off topic, but I just thought of this again: is whitespace allowed or
: disallowed between sigil and name?

Disallowed.

Larry

Reply via email to