Re: [pugs]weird thing with say ++$

2005-04-25 Thread Steven Philip Schubiger
On 21 Apr, fayland wrote:

: It has been published at perl6.language, but have no reply.

That was to be expected, as it's no language-design specific issue,
and therefore, unsuitable for p6l.


: In perl v5.8.6 built for MSWin32-x86-multi-thread:
: 
: my $i = 1;
: print $i++, ++$i; # 1 3
: my $i = 1;
: print ++$i, $i++; # 3 2

You're misleaded here, by thinking, scalar context is being enforced,
which is not the case; the results of the increment operator operations (ops) 
on the scalar are being passed in (implicit) array context to the print builtin.

Every Perl program, that gets compiled and interpreted, will be
converted to a syntax tree initially. The following is a selected excerpt
from the output of the core module B::Terse, which displays, what syntax
tree we actually got hold of.

LISTOP (0x3c013760) print 
OP (0x3c013780) pushmark 
UNOP (0x3c013700) postinc [2] 
OP (0x3c0136e0) padsv [1] 
UNOP (0x3c013740) preinc 
OP (0x3c013720) padsv [1]

So, LISTOP indicates, that a list context is being encountered, which is
not, what we actually want. The syntax trees for the two examples,
provided above, don't differ that much, except, as you'd assume, in case
of the ordering of the UNOPs. I don't see any way to explain, what's
going wrong *exactly* by examining the syntax tree; that'd require
digging into the internals, I'd assume.


my $i = 1;

and either

print $i++; print ++$i;
or
print ++$i; print $i++;


does what you assumed, it was supposed to do, but without
having the compiler struggling against implicit assumptions.


: in pugs:
: 
: my $i = 1;
: say $i++, ++$i; # 1 3
: 
: my $i = 1;
: say ++$i, $i++; # 2 2

This leads me to think, Pugs has implemented the behaviour, that has
been outlayed in Apocalypse 03: Operators, RFC 082 - Arrays: Apply
operators element-wise in a list context,
http://dev.perl.org/perl6/doc/design/apo/A03.html


: which is right?(I think perl5 is) or it's different between Perl5 and
Perl6?

I'm not inclined to think, that Perl 5 is wrong here, as letting it
assume array context, is in this context, like assuming, filling your
fridge with food, it consists of, by randomly throwing some of it in,
will come out sorted again; Perl 6 does, what the specifications urge
upon it to do.

 
: /Fayland Lam/

Steven




Re: [pugs]weird thing with say ++$

2005-04-25 Thread Juerd
Steven Philip Schubiger skribis 2005-04-25  5:41 (+0200):
 That was to be expected, as it's no language-design specific issue,
 and therefore, unsuitable for p6l.
 : print ++$i, $i++; # 3 2
 You're misleaded here, by thinking, scalar context is being enforced,
 which is not the case; the results of the increment operator operations (ops) 
 on the scalar are being passed in (implicit) array context to the print 
 builtin.

I don't know how it's called on other levels, but we're still calling
that list|slurpy|plural context. array context looks too much like
Array context, which is something else.

In array context, @foo is passed as the array that it is. In
list context, it is flattened. Big and very important difference.


Juerd
-- 
http://convolution.nl/maak_juerd_blij.html
http://convolution.nl/make_juerd_happy.html 
http://convolution.nl/gajigu_juerd_n.html


Re: [pugs]weird thing with say ++$

2005-04-25 Thread Steven Philip Schubiger
On 25 Apr, Juerd wrote:

: I don't know how it's called on other levels, but we're still calling
: that list|slurpy|plural context. array context looks too much like
: Array context, which is something else.

I confess, it's likely a bad habit, to coin it array context on
p6l, although it refers to Perl 5, where it I have seen it more than
once - perhaps, overly abused too.

: In array context, @foo is passed as the array that it is. In
: list context, it is flattened. Big and very important difference.

You're supposedly right.

: Juerd

Steven



Re: [pugs]weird thing with say ++$

2005-04-25 Thread Juerd
Steven Philip Schubiger skribis 2005-04-25 18:44 (+0200):
 I confess, it's likely a bad habit, to coin it array context on
 p6l, although it refers to Perl 5, where it I have seen it more than
 once - perhaps, overly abused too.

That's old Perl5-ese. There was a big jargon change when people started
to realise and agree that having two things both called arrays or lists
was confusing. There are still some occurrences of array context left,
but in reality, even in Perl 5, that should only refer to the context in
which an array is expected, as provided by a \@ prototype.


Juerd
-- 
http://convolution.nl/maak_juerd_blij.html
http://convolution.nl/make_juerd_happy.html 
http://convolution.nl/gajigu_juerd_n.html


Re: [pugs]weird thing with say ++$

2005-04-21 Thread Paul Johnson
On Thu, Apr 21, 2005 at 04:32:41PM +0800, fayland wrote:

 It has been published at perl6.language, but have no reply.
 
 In perl v5.8.6 built for MSWin32-x86-multi-thread:
 
 my $i = 1;
 print $i++, ++$i; # 1 3
 my $i = 1;
 print ++$i, $i++; # 3 2
 
 in pugs:
 
 my $i = 1;
 say $i++, ++$i; # 1 3
 
 my $i = 1;
 say ++$i, $i++; # 2 2
 
 which is right?(I think perl5 is) or it's different between Perl5 and Perl6?

I think I understand the implementation details leading to each
behaviour, but rather than saying which was right, I think I'd be
quite happy to see Perl6 copy (the ideas behind) C's rules regarding
sequence points and undefined behaviour.  I'm not so sure about
implementation defined and unspecified behaviour.

When I see code such as this, I usually encourage people to program Perl
as if it had sequence points and undefined behaviour.  This often
results in explaining what they are, but maybe that's not such a great
problem.

See http://www.eskimo.com/~scs/C-faq/faq.html, especially sections 3.8
and 11.33 for details.

-- 
Paul Johnson - [EMAIL PROTECTED]
http://www.pjcj.net


Re: [pugs]weird thing with say ++$

2005-04-21 Thread Johan Vromans
Paul Johnson [EMAIL PROTECTED] writes:

 I think I understand the implementation details leading to each
 behaviour, but rather than saying which was right, I think I'd be
 quite happy to see Perl6 copy (the ideas behind) C's rules regarding
 sequence points and undefined behaviour.  I'm not so sure about
 implementation defined and unspecified behaviour.

Isn't this the old prefix-++ problem:

  @a = (++$i,++$i,++$i);
  print @a;# prints 3 3 3

-- Johan


Re: [pugs]weird thing with say ++$

2005-04-21 Thread Nathan Gray
On Thu, Apr 21, 2005 at 11:45:27AM +0200, Paul Johnson wrote:
 On Thu, Apr 21, 2005 at 04:32:41PM +0800, fayland wrote:
 
  It has been published at perl6.language, but have no reply.
  
  In perl v5.8.6 built for MSWin32-x86-multi-thread:
  
  my $i = 1;
  print $i++, ++$i; # 1 3
  my $i = 1;
  print ++$i, $i++; # 3 2
  
  in pugs:
  
  my $i = 1;
  say $i++, ++$i; # 1 3
  
  my $i = 1;
  say ++$i, $i++; # 2 2
  
  which is right?(I think perl5 is) or it's different between Perl5 and Perl6?
 
 I think I understand the implementation details leading to each
 behaviour, but rather than saying which was right, I think I'd be
 quite happy to see Perl6 copy (the ideas behind) C's rules regarding
 sequence points and undefined behaviour.  I'm not so sure about
 implementation defined and unspecified behaviour.

It certainly makes more sense to me that the answer would be 2 2.  But
however it ends up, so long as we know what the answer will be, we can
utilize it effectively in our programs.

-kolibrie


Re: [pugs]weird thing with say ++$

2005-04-21 Thread Matthew Walton
 On Thu, Apr 21, 2005 at 11:45:27AM +0200, Paul Johnson wrote:

 It certainly makes more sense to me that the answer would be 2 2.  But
 however it ends up, so long as we know what the answer will be, we can
 utilize it effectively in our programs.

The trick with this construct usually in C is that the C standard doesn't
specify the order of evaluation of function arguments, so you can never be
sure if you'll get the same result if you compile it other than on your
development system (different compilers may evaluate them in a different
order). The Pugs example given in the original post seems to me to be
fairly sane, as it shows left-to-right evaluation. The Perl 5 example, as
far as I can tell, shows left-to-right for the first case and
right-to-left for the second case, which is just odd... please correct me
if I'm wrong, but that seems the only way those answers could have been
arrived at.
So really, what needs to be said is how Perl 6 is supposed to evaluate the
arguments to function calls, then we can know if the current behaviour in
Pugs is correct.