Re: RFC 56 (v1) Optional 2nd argument to pop() and shift

2000-08-07 Thread Gisle Aas

Aaron J Mackey <[EMAIL PROTECTED]> writes:

> proposed:
> 
> @b = pop @a, $n;

That will change the behaviour of this perl5 code:

   foo(pop @a, "bar")

If we do this then the code above need to be fixed by the perl5->perl6
filter.

Regards,
Gisle



Re: RFC 56 (v1) Optional 2nd argument to pop() and shift

2000-08-07 Thread Aaron J Mackey


proposed:

@b = pop @a, $n;

should this be equivalent to:

@b = splice @a, -$n; # no longer a LIFO queue

or :

@b = reverse splice @a, -$n; # still a LIFO queue


I guess it all depends on what you then do with @b, but you get my drift.
This should be addressed, one way or another.

-Aaron




Re: RFC 56 (v1) Optional 2nd argument to pop() and shift

2000-08-07 Thread Chaim Frenkel

PRL>3) C would then act as C and C would
PRL>   act as C

I'll take door #3, Jonathan.


-- 
Chaim FrenkelNonlinear Knowledge, Inc.
[EMAIL PROTECTED]   +1-718-236-0183



RFC 56 (v1) Optional 2nd argument to pop() and shift

2000-08-07 Thread Perl6 RFC Librarian

This and other RFCs are available on the web at
  http://dev.perl.org/rfc/

=head1 TITLE

Optional 2nd argument to pop() and shift()

=head1 VERSION

  Maintainer: Jonathan Scott Duff <[EMAIL PROTECTED]>
  Date: 7 Aug 2000
  Version: 1
  Mailing List: [EMAIL PROTECTED]
  Number: 56

=head1 ABSTRACT

The inverse operations to C and C both accept a LIST to
"add" to an array, yet C and C only remove B element
from an array.  In the interest of symmetry and TMTOWTDI, C and
C should allow the programmer to remove multiple items from an
array.

=head1 DESCRIPTION

The intent should be obvious, but I'll point it out anyway.

=head2 pop

The documentation for Perl 5.6.0 states that pop has one of two forms:
C, or just C.  This RFC proposes that a third form be
added to C

=over 4

=item pop ARRAY, EXPR

EXPR would be evaluated to determine the number of elements to remove
from the end of ARRAY and that number would be removed and returned.
Thus C would be a more natural inverse to C (If you can
add multiple elements to an array with C, why can't you remove
multiple elements from an array with C?)

=back

This functionality can currently be accomplished with C, but
it is non-obvious that C should be the routine to call and
the method isn't at all intuitive.  To "pop" the last $N items off of
the end of an array using C, the call looks like this:

splice @array, -$N; # remove the last $N items

contrast to the more natural looking

pop @array, $N; # remove the last $N items

=head2 shift

The semantics for C are similar to C except that it
operates on the other end of the array.  C also suffers from
the inability to shift more than one element from the array.  Just
like C, the two forms of C are a C, and
just plain C.  This RFC proposes that a third form be added:

=over 4

=item shift ARRAY, EXPR

EXPR would be evaluated to determine the number of elements to remove
from the beginning of ARRAY and that number would be removed and returned.
Thus, C would be a more natural inverse to C.  (If
you can add multiple elements to an array with C, why can't
you remove multiple elements with C?)

=back

As with C the proposed semantics can be accomplished with
C and are just as un-intuitive:

splice @array, 0, $N;   # remove the first $N elements

contrast to

shift @array, $N;   # remove the first $N elements

=head2 Random examples

@numbers = 1..10;
$ten = pop @numbers;# still works
@popped = pop @numbers, 3;  # Take away 7, 8, 9
push @numbers, @popped; # Put 'em back
@popped = pop @numbers, 0;  # Nothing happens
@popped = pop @numbers, 9;  # And then there were none.

@numbers = 1..10;
@popped = pop @numbers, 100;# And then there were none but
# @popped only has 10 things

@numbers = 1..10;
$one = shift @numbers;  # still works
@shifted = shift @numbers, 3;   # Take away 2, 3, and 4
unshift @numbers, @shifted; # Put 'em back
@shifted = shift @numbers, 0;   # Nothing happens
@shifted = shift @numbers, 9;   # And then there were none.

@numbers = 1..10;
@shifted = shift @numbers, 100; # And then there were none but
# @shifted only has 10 things

=head1 IMPLEMENTATION

I don't know the gory details other than it should be possible.
However, there is one implementation detail that occurs to me:
What should happen when the expression given to C, or
C evaluates to a negative number?  I see three options:

1) Nothing.  We can only pop/shift positive amounts
2) Act as if the number were positive  (i.e. abs(EXPR))
3) C would then act as C and C would
   act as C

The author of this RFC sees arguments for all three.

=head1 REFERENCES

The Perl 5.6.0 documentation
L
L
L