Re: Array/list transformations.

2005-12-27 Thread Larry Wall
On Tue, Dec 27, 2005 at 01:13:10PM -0500, Rob Kinyon wrote:
: On 12/27/05, Larry Wall <[EMAIL PROTECTED]> wrote:
: > On Tue, Dec 27, 2005 at 12:10:45AM -0500, Rob Kinyon wrote:
: > : Creating an array whose positions are aliases for positions in another
: > : array can be useful. How about
: > :
: > : my @s := @a[0,2,4] is alias;
: > :
: > : @a[2] = 3; # @s[1] == 3
: > : @s[1] = 4; # @a[2] == 4
: > :
: > : The default slicing behavior would default to "is copy", to preserve
: > : the current semantics. Does that sound reasonable?
: >
: > Hmm.  Assignment is already adequate for copying semantics.  And binding
: > the individual elements can presumably be done by:
: >
: > my [EMAIL PROTECTED] := @a[0,2,4];
: 
: What's the difference between:
: 
: my @s := @a[0,2,4];
: 
: and
: 
: my [EMAIL PROTECTED] := @a[0,2,4];
: 
: ?

As with function parameter binding, the first would attempt to bind only
the first argument, that is, @a[0].  The main difference between :=
and parameter binding is that := defaults to rw instead of readonly.

Larry


Re: Array/list transformations.

2005-12-27 Thread Rob Kinyon
On 12/27/05, Larry Wall <[EMAIL PROTECTED]> wrote:
> On Tue, Dec 27, 2005 at 12:10:45AM -0500, Rob Kinyon wrote:
> : Creating an array whose positions are aliases for positions in another
> : array can be useful. How about
> :
> : my @s := @a[0,2,4] is alias;
> :
> : @a[2] = 3; # @s[1] == 3
> : @s[1] = 4; # @a[2] == 4
> :
> : The default slicing behavior would default to "is copy", to preserve
> : the current semantics. Does that sound reasonable?
>
> Hmm.  Assignment is already adequate for copying semantics.  And binding
> the individual elements can presumably be done by:
>
> my [EMAIL PROTECTED] := @a[0,2,4];

What's the difference between:

my @s := @a[0,2,4];

and

my [EMAIL PROTECTED] := @a[0,2,4];

?

Rob


Re: Array/list transformations.

2005-12-26 Thread Larry Wall
On Tue, Dec 27, 2005 at 12:10:45AM -0500, Rob Kinyon wrote:
: Creating an array whose positions are aliases for positions in another
: array can be useful. How about
: 
: my @s := @a[0,2,4] is alias;
: 
: @a[2] = 3; # @s[1] == 3
: @s[1] = 4; # @a[2] == 4
: 
: The default slicing behavior would default to "is copy", to preserve
: the current semantics. Does that sound reasonable?

Hmm.  Assignment is already adequate for copying semantics.  And binding
the individual elements can presumably be done by:

my [EMAIL PROTECTED] := @a[0,2,4];

Larry


Re: Array/list transformations.

2005-12-26 Thread Rob Kinyon
On 12/22/05, Jonathan Scott Duff <[EMAIL PROTECTED]> wrote:
> On Thu, Dec 22, 2005 at 04:47:21PM +0100, Michele Dondi wrote:
> > Also I wonder if one will be able to push(), pop(), etc. array slices as
> > well whole arrays. A' la
> >
> > my @a=qw/aa bb cc dd ee/;
> > my $s=pop @a[0..2];  # or [0,2] or just [0] for that matters!
> > # $s='cc';
> > # @a=qw/aa bb dd ee/; => same as what I can do with slice()
> >
> > Not terribly necessary, but indeed consistent IMHO.
>
> Not quite sure why you'd want this, but if we have something like this:
>
> my @a = qw/aa bb cc dd ee/;
> my @slice :=  @a[0..2];
> my $s = pop @slice;
>
> (where @slice is a "reference" to part of @a)
>
> You get what you want and more.

To echo Scott's point, @a[0..2] === @a.splice(0,3).

Now, a more interesting problem is @a[0,2,4], which doesn't map to a
single splice() call. Ruby's syntax for this is problematic, which
points to a problem with how the solutionspaces are mapping to the
problemspaces.

Creating an array whose positions are aliases for positions in another
array can be useful. How about

my @s := @a[0,2,4] is alias;

@a[2] = 3; # @s[1] == 3
@s[1] = 4; # @a[2] == 4

The default slicing behavior would default to "is copy", to preserve
the current semantics. Does that sound reasonable?

Rob


Re: Array/list transformations.

2005-12-22 Thread Jonathan Scott Duff
On Thu, Dec 22, 2005 at 04:47:21PM +0100, Michele Dondi wrote:
> This is not a substantial issue regarding Perl 6, but is more a minor 
> feature curiosity/meditation. It was inspired some time ago by this PM 
> node:
> 
> http://perlmonks.org/?node_id=509310
> 
> I was wondering if in addition to push(), pop() etc. there could be be 
> rot() and roll() methods that would act upon lists (not modifying them) 
> like thus:
> 
> (qw/aa bb cc dd ee/).rot(2)   # qw/cc dd ee aa bb/
> (qw/aa bb cc dd ee/).rot()# qw/bb cc dd ee aa/ => same as .rot(1)
> (qw/aa bb cc dd ee/).roll(2)  # qw/dd ee aa bb cc/ => same as .rot(-2)
> (qw/aa bb cc dd ee/).roll()   # qw/ee aa bb cc dd/ => same as .roll(1)

"rot" doesn't conjur the right stuff for me, sorry.

Since we already have shifting operators, why not just (re)use them?
If +< is "numeric" left shift, maybe @< is "array" left shift.
Of course, then you'd have to figure how to vary the wrapping
semantics.

my @a = qw/aa bb cc dd ee/;
@a = @a @< 2;   # or @a @<= 2;
my @b = @a @> 4;

Okay, I'm already not liking that syntax, but the idea is the same: we
have "shifting" ops, let capitalize on that meme.

> ...
> etc.
> 
> Also I wonder if one will be able to push(), pop(), etc. array slices as 
> well whole arrays. A' la
> 
> my @a=qw/aa bb cc dd ee/;
> my $s=pop @a[0..2];  # or [0,2] or just [0] for that matters!
> # $s='cc';
> # @a=qw/aa bb dd ee/; => same as what I can do with slice()
> 
> Not terribly necessary, but indeed consistent IMHO.

Not quite sure why you'd want this, but if we have something like this:

my @a = qw/aa bb cc dd ee/;
my @slice :=  @a[0..2];
my $s = pop @slice;

(where @slice is a "reference" to part of @a) 

You get what you want and more.

-Scott
-- 
Jonathan Scott Duff
[EMAIL PROTECTED]


Array/list transformations.

2005-12-22 Thread Michele Dondi
This is not a substantial issue regarding Perl 6, but is more a minor 
feature curiosity/meditation. It was inspired some time ago by this PM 
node:


http://perlmonks.org/?node_id=509310

I was wondering if in addition to push(), pop() etc. there could be be 
rot() and roll() methods that would act upon lists (not modifying them) 
like thus:


(qw/aa bb cc dd ee/).rot(2)   # qw/cc dd ee aa bb/
(qw/aa bb cc dd ee/).rot()# qw/bb cc dd ee aa/ => same as .rot(1)
(qw/aa bb cc dd ee/).roll(2)  # qw/dd ee aa bb cc/ => same as .rot(-2)
(qw/aa bb cc dd ee/).roll()   # qw/ee aa bb cc dd/ => same as .roll(1)
...
etc.

Also I wonder if one will be able to push(), pop(), etc. array slices as 
well whole arrays. A' la


my @a=qw/aa bb cc dd ee/;
my $s=pop @a[0..2];  # or [0,2] or just [0] for that matters!
# $s='cc';
# @a=qw/aa bb dd ee/; => same as what I can do with slice()

Not terribly necessary, but indeed consistent IMHO.


Michele
--
you'll see that it shouldn't be so. AND, the writting as usuall is
fantastic incompetent. To illustrate, i quote:
- Xah Lee trolling in clpmisc,
  "perl bug File::Basename and Perl's nature"