Hacker News new | comments | show | ask | jobs | submit login

You don't understand what the following means

  1 ^..^ 5
It means a Range of values from 1 to 5 excluding 1 and 5.

  1         ~~  1^..^5; # False
  5         ~~  1^..^5; # False
  1.000001  ~~  1^..^5; # True
  4.999999  ~~  1^..^5; # True
It is short for

  Range.new( 1, 5, excludes-min => True, excludes-max => True )
One of the benefits if you want to get the first 10 items from an array is that you can use the numbers 0 and 10

  @a[ 0..^10 ]
It also means you don't have to do so many +1 or -1 when generating a sequence

  $n+1  ..  $m-1
  $n   ^..^ $m
We don't have to declare ranges with a number past the end like Python

  range(0,n+1)

  0..$n
… but we can if it increases clarity

  range(0,m)

  0..^$m
Since we don't use prefix ^ for anything else, we have it as shorthand for the above

  0..^$m
     ^$m
---

Perl 6 doesn't have a Z=> operator. It has a Z meta-operator and a => operator.

  my %hash = @keys Z[=>] @values;
short for

  my %hash = zip( @keys, @values ).map: -> ( $key, $value ) { Pair.new( $key, $value }
I would like to know which of those you can scan over and be sure it is correct without much thought.

We also don't have a += operator, instead = is also a meta-operator

  $i  +=  2;
  $i [+]= 2; # more explicit, but identical
Which means that if you modify an existing infix operator or add a new one, you get something like += for free.

  sub infix:< +++ > ( $l, $r ) { $l + 1 + $r }

  $i +++= 1;
Note that since operators are so simple, we don't have to re-use operators for completely different operations. Just add a new one.

---

Sigils and Twigils allow us to know the scope of a variable and that it is a variable, at a glance.

  sub value () { 10 }

  submethod BUILD ( $value ) {
    $!value = $value || value
  #   ^          ^        ^
  #   |          |         \_ not a variable
  #   |           \__________ subroutine scoped
  #    \_____________________ class scoped
  }
There are also compile time "variables"

  say $?LINE;
and dynamic variables (thread local)

  say %*ENV;
This makes it so that when you modify a dynamic variable, it is immediately obvious that is what you are doing.

  sub foo () {
    $*foo = 42;
  }

  my $*foo = 0;
  foo();
  say $*foo; # 42



  sub bar () {
    $bar = 42;  # compile-time error
  }

  my $bar = 0;
  bar();
  say $bar;





Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact

Search: