Re: List assignment question

2006-11-16 Thread Jonathan Rockway
Mark J. Reed wrote:
 I distinctly recall having to do things like (my $a, undef, my $b) to
 avoid errors because you can't assign to undef.  Maybe I'm just
 hallucinating.

Maybe :)

$ perl -Mstrict -e 'my ($a, undef, $b) = 1..3; print $a $b\n;'
1 3

This works as far back as v5.6.0 (which is the oldest I have around).

-- 
package JAPH;use Catalyst qw/-Debug/;($;=JAPH)-config(name = do {
$,.=reverse qw[Jonathan tsu rehton lre rekca Rockway][$_].[split //,
;$;]-[$_].q; ;for 1..4;$,=~s;^.;;;$,});$;-setup;


Re: List assignment question

2006-11-16 Thread Jonathan Rockway
Vincent Foley wrote:
 Hello everyone,
 
 I was toying around with Pugs and I tried the following Perl 5 list
 assignment
 
  my ($a, undef, $b) = 1..3;
 
 Which gave me the following error message:
 
  Internal error while running expression:
  ***
  Unexpected ,
  expecting word character, \\, :, * or parameter name
  at interactive line 1, column 14

For reference, this sort of operation works if you write it on two
lines, like:

my ($a, $b);
($a, undef, $b) = 1..3;
say $a is 1 and $b is 3;

I'll look around in the source and see if I can make this work like
perl5 (unless that's a bad idea for some reason).

Regards,
Jonathan Rockway

-- 
package JAPH;use Catalyst qw/-Debug/;($;=JAPH)-config(name = do {
$,.=reverse qw[Jonathan tsu rehton lre rekca Rockway][$_].[split //,
;$;]-[$_].q; ;for 1..4;$,=~s;^.;;;$,});$;-setup;


Re: List assignment question

2006-11-16 Thread Larry Wall
On Wed, Nov 15, 2006 at 10:28:41AM -0600, Jonathan Rockway wrote:
: For reference, this sort of operation works if you write it on two
: lines, like:
: 
: my ($a, $b);
: ($a, undef, $b) = 1..3;
: say $a is 1 and $b is 3;
: 
: I'll look around in the source and see if I can make this work like
: perl5 (unless that's a bad idea for some reason).

That will just be my ($a, $, $b) = 1..3 in Perl 6.  It should be
an error to try to modify undef, I think, and we have a notation for
anonymous variables, so why not use it?

Larry


Re: List assignment question

2006-11-15 Thread Larry Wall
On Tue, Nov 14, 2006 at 10:15:42PM -0500, Vincent Foley wrote:
: Hello everyone,
: 
: I was toying around with Pugs and I tried the following Perl 5 list 
: assignment
: 
:  my ($a, undef, $b) = 1..3;
: 
: Which gave me the following error message:
: 
:  Internal error while running expression:
:  ***
:  Unexpected ,
:  expecting word character, \\, :, * or parameter name
:  at interactive line 1, column 14
: 
: I had a quick discussion on #perl6 with TimToady++ during my lunch
: hour, and he said that assignment to undef was no longer valid.  His
: suggestion was to use the whatever operator (*) instead.

FWIW, I think we should follow gaal++'s suggestion and just use $ instead.
Now that I think about it some more, the * is likely to be confused with
the slurpy *, at least by readers if not by the parser.

: Now, this isn't implemented and my Haskell skills and knowledge of
: Pugs' internals aren't really advanced enough to implement this
: feature, however I can surely contribute the tests.  Here's what I
: have right now in my working copy, let me know if this seems
: reasonable.

(assuming * replaced by $ here)

:my @a = 1..3;
:my ($one, *, $three) = @a;
:is(~($one, $three), 1 3, list assignment my ($, *, $) = @ works);

Why not just interpolate: $one $three

:my (*, $two) = @a;
:is($two, 2, list assignment my (*, $) = @ works);
:my (*, *, $three) = @a;
:is($three, 3, list assignment my (*, *, $) = @ works);

Note that this my $three is declaring the same $three lexical,
unlike in Perl 5, which would warn about a redeclaration.  That's part
of why it's customary to put each test chunk in its own bare block
to prevent such accidental collisions.

:my (*, @b) = @a;
:is([EMAIL PROTECTED], 2 3, list assignment my (*, @) = @ works);

Other than that, looks good to me.

Larry


Re: List assignment question

2006-11-15 Thread Mark J. Reed

On 11/14/06, Vincent Foley [EMAIL PROTECTED] wrote:

I was toying around with Pugs and I tried the following Perl 5 list assignment

  my ($a, undef, $b) = 1..3;


Huh.  I didn't think that worked in Perl 5, either.  What am I misremembering?
I distinctly recall having to do things like (my $a, undef, my $b) to
avoid errors because you can't assign to undef.  Maybe I'm just
hallucinating.


Re: List assignment question

2006-11-15 Thread Ævar Arnfjörð Bjarmason

On 11/15/06, Mark J. Reed [EMAIL PROTECTED] wrote:

On 11/14/06, Vincent Foley [EMAIL PROTECTED] wrote:
 I was toying around with Pugs and I tried the following Perl 5 list assignment

   my ($a, undef, $b) = 1..3;

Huh.  I didn't think that worked in Perl 5, either.  What am I misremembering?
I distinctly recall having to do things like (my $a, undef, my $b) to
avoid errors because you can't assign to undef.  Maybe I'm just
hallucinating.



(my $x, undef, my $y) = 1 .. 3; parses to my ($x, undef, $y) = 1 .. 3
and always has as far as I know, so please share your hallucinogens
with the list:)


Re: List assignment question

2006-11-15 Thread Brandon S. Allbery KF8NH


On Nov 15, 2006, at 12:04 PM, Mark J. Reed wrote:


On 11/14/06, Vincent Foley [EMAIL PROTECTED] wrote:
I was toying around with Pugs and I tried the following Perl 5  
list assignment


  my ($a, undef, $b) = 1..3;


Huh.  I didn't think that worked in Perl 5, either.  What am I  
misremembering?

I distinctly recall having to do things like (my $a, undef, my $b) to
avoid errors because you can't assign to undef.  Maybe I'm just
hallucinating.


It didn't work in early Perl, but certainly did by 5.00503.  I don't  
recall when it was added.


--
brandon s. allbery [linux,solaris,freebsd,perl]   
[EMAIL PROTECTED]
system administrator  [openafs,heimdal,too many hats]   
[EMAIL PROTECTED]
electrical and computer engineering, carnegie mellon university   
KF8NH





Re: List assignment question

2006-11-15 Thread Paul Seamons
my ($a, undef, $b) = 1..3;

 Huh.  I didn't think that worked in Perl 5, either.  What am I
 misremembering? I distinctly recall having to do things like (my $a, undef,
 my $b) to avoid errors because you can't assign to undef.  Maybe I'm just
 hallucinating.

Are you remembering this:

  my $a = 1;
  ($a, undef, my $b) = 1..3;

If you attempted to do 

  my ($a, undef, $b) you'd get a warn error about re-declaring $a.

Paul


Re: List assignment question

2006-11-15 Thread Nicholas Clark
On Wed, Nov 15, 2006 at 05:41:24PM +, Ævar Arnfjörð Bjarmason wrote:
 On 11/15/06, Mark J. Reed [EMAIL PROTECTED] wrote:
 On 11/14/06, Vincent Foley [EMAIL PROTECTED] wrote:
  I was toying around with Pugs and I tried the following Perl 5 list 
 assignment
 
my ($a, undef, $b) = 1..3;
 
 Huh.  I didn't think that worked in Perl 5, either.  What am I 
 misremembering?
 I distinctly recall having to do things like (my $a, undef, my $b) to
 avoid errors because you can't assign to undef.  Maybe I'm just
 hallucinating.
 
 
 (my $x, undef, my $y) = 1 .. 3; parses to my ($x, undef, $y) = 1 .. 3
 and always has as far as I know, so please share your hallucinogens
 with the list:)

I thought that allowing undef in my ($a, undef, $b) came in around 5.004ish,
but I can't find it in perldelta, and I don't have a version compiled to
test with (or any quick way to compile them, given that pretty much only
AIX is so stable that early perls compile unmodified. Probably someone will
tell me that VMS is also good enough, for 5.002 or later)

Nicholas Clark


Re: List assignment question

2006-11-15 Thread Dave Mitchell
On Wed, Nov 15, 2006 at 11:17:57PM +, Nicholas Clark wrote:
 I thought that allowing undef in my ($a, undef, $b) came in around 5.004ish,
 but I can't find it in perldelta, and I don't have a version compiled to
 test with (or any quick way to compile them, given that pretty much only
 AIX is so stable that early perls compile unmodified. Probably someone will
 tell me that VMS is also good enough, for 5.002 or later)

$ perl-5322 -we'my ($x,undef,$y) = 1..3'
Can't declare undef operator in my at -e line 1, near ) =
Execution of -e aborted due to compilation errors.
$ perl545 -we'my ($x,undef,$y) = 1..3'
$

-- 
There's something wrong with our bloody ships today, Chatfield.
-- Admiral Beatty at the Battle of Jutland, 31st May 1916.


Re: List assignment question

2006-11-15 Thread Mark J. Reed

On 11/15/06, Ævar Arnfjörð Bjarmason [EMAIL PROTECTED] wrote:

On 11/15/06, Mark J. Reed [EMAIL PROTECTED] wrote:
 On 11/14/06, Vincent Foley [EMAIL PROTECTED] wrote:
  I was toying around with Pugs and I tried the following Perl 5 list
assignment
 
my ($a, undef, $b) = 1..3;

 Huh.  I didn't think that worked in Perl 5, either.  What am I
misremembering?
 I distinctly recall having to do things like (my $a, undef, my $b) to
 avoid errors because you can't assign to undef.  Maybe I'm just
 hallucinating.


(my $x, undef, my $y) = 1 .. 3; parses to my ($x, undef, $y) = 1 .. 3
and always has as far as I know, so please share your hallucinogens
with the list:)



Sadly, the hallucinogens are essential, not external.  But I'm pretty
sure those are two different parse trees.

I misremembered the reason for the construct, though: assigning to
undef has always been ok (even in perl4 and probably earlier), but
declaring my undef wasn't, iirc.

--
Mark J. Reed [EMAIL PROTECTED]


Re: List assignment question

2006-11-15 Thread Mark J. Reed

On 11/15/06, Dave Mitchell [EMAIL PROTECTED] wrote:


$ perl-5322 -we'my ($x,undef,$y) = 1..3'
Can't declare undef operator in my at -e line 1, near ) =
Execution of -e aborted due to compilation errors.
$ perl545 -we'my ($x,undef,$y) = 1..3'
$


Ah-hah! So I'm not crazy! Necessarily, anyway.  Just behind the times.

Thanks, Dave!

--
Mark J. Reed [EMAIL PROTECTED]