This and other RFCs are available on the web at
http://dev.perl.org/rfc/
=head1 TITLE
Builtins: zip() and unzip()
=head1 VERSION
Maintainer: Jeremy Howard <[EMAIL PROTECTED]>
Date: 11 August 2000
Version: 1
Mailing List: [EMAIL PROTECTED]
Number: 90
=head1 ABSTRACT
It is proposed that two new functions, C<zip>, and C<unzip>, be added to
Perl. C<zip(\@list1, \@list2, ...)> would return a list that interleaved
its arguments. C<unzip($list_size, \@list)> would reverse this operation.
=head1 DESCRIPTION
Miranda, the upcoming Python v2.0, and numerous functional languages use
a function called C<zip> to interleave the arguments of arrays together.
It is proposed that Perl implement this function, and evaluate it lazily.
For instance:
@a = (1,3,5);
@b = (2,4,6);
@zipped_list = zip(\@a,\@b); # (1,2,3,4,5,6)
This makes it easy to operate on multiple lists using flexible reduction
functions:
$sum_xy = sub {reduce ^last+^x*^y, zip($_[0], $_[1])};
print $sum_xy->(\@a, \@b); # Prints '44', i.e. 1*2+3*4+5*6
In order to reverse this operation we need an C<unzip> function:
@zipped_list = zip(\@a,\@b); # (1,2,3,4,5,6)
@unzipped_list = unzip(3, \@zipped_list); # ([1,3,5], [2,4,6])
If the list to be unzipped is not an exact multiple of the partition size,
the final list references are not padded--their length is one less than
the list size. For example:
@list = (1..7);
@unzipped_list2 = unzip(3, \@list); # ([1,4,7], [2,5], [3,6])
=head1 IMPLEMENTATION
The C<zip> and C<unzip> functions should be evaluated lazily.
Effectively, C<zip> creates an iterator over multiple lists. If used as
part of a reduction, the actual interleaved list need never be created.
For instance:
$sum_xy = sub {reduce ^last+^x*^y, zip($_[0], $_[1])};
$answer = $sum_xy->(\@a, \@b);
should be evaluated as if it read:
$answer = 0;
$answer += $a[$_] * $b[$_] for (0..$#a-1));
which does not need to create an intermediate list.
=head1 REFERENCES
RFC 23: Higher order functions
RFC 76: Builtin: reduce