summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNami-Doc <vendethiel@hotmail.fr>2014-06-29 21:41:57 +0200
committerNami-Doc <vendethiel@hotmail.fr>2014-06-29 21:41:57 +0200
commit4b9c50733d9a2b20ce09b8a42c36df47a0ea10c7 (patch)
tree5811d63a27f1d3b495bb359c038a1d83e348f6c4
parent2a8e20ca27c59347df58197f821b1eee2e913128 (diff)
Moar operators
-rw-r--r--perl6.html.markdown86
1 files changed, 84 insertions, 2 deletions
diff --git a/perl6.html.markdown b/perl6.html.markdown
index 4ba76d6c..7a8c7525 100644
--- a/perl6.html.markdown
+++ b/perl6.html.markdown
@@ -78,11 +78,12 @@ unless False {
say "It's not false !";
}
+
# if (true) say; # Won't work
# `given`-`when` looks like other languages `switch`, but it's much more powerful thanks to smart matching :
-given "foo bar" { # given just puts its argument into `$_`, and `when` uses it.
- when /foo/ { # smart matching a string with a regex returns true if it matches
+given "foo bar" { # given just puts its argument into `$_`, and `when` uses it using the "smart matching" operator.
+ when /foo/ { # you'll read about the smart-matching operator below
say "Yay !";
}
when $_.chars > 50 { # smart matching anything with True gives True, so you can also put "normal" conditionals
@@ -118,4 +119,85 @@ for array {
if long-computation() -> $result {
say "The result is $result";
}
+
+
+
+# Operators
+
+## Since Perl languages are very much operator-based languages
+## Perl 6 operators are actually just funny-looking subroutines, in syntactic categories,
+## like infix:<+> (addition) or prefix:<!> (bool not)
+
+## The categories are :
+### - "prefix" : before (like `!` in `!True`).
+### "postfix" : after (like `++` in `$a++`).
+### "infix" : in between (like `*` in `4 * 3`).
+### "circumfix" : around (like `[`-`]` in `[1, 2]`).
+### "post-circumfix" : around, after another term (like `{`-`}` in `%hash{'key'}`)
+
+## The precedence list can be found here : http://perlcabal.org/syn/S03.html#Operator_precedence
+## But first, we need a little explanation about associativity :
+
+### Binary operators:
+$a ! $b ! $c; # with a left-associative `!`, this is `($a ! $b) ! $c`
+$a ! $b ! $c; # with a right-associative `!`, this is `$a ! ($b ! $c)`
+$a ! $b ! $c; # with a non-associative `!`, this is illegal
+$a ! $b ! $c; # with a chain-associative `!`, this is `($a ! $b) and ($b ! $c)`
+$a ! $b ! $c; # with a list-associative `!`, this is `infix:<>`
+
+### Unary operators:
+!$a! # with left-associative `!`, this is `(!$a)!`
+!$a! # with right-associative `!`, this is `!($a!)`
+!$a! # with non-associative `!`, this is illegal
+
+## Alright, you're set to go !
+
+## * Equality Checking
+
+### - `==` is numeric comparison
+3 == 4; # False
+3 != 4; # True
+
+### - `eq` is string comparison
+'a' eq 'b';
+'a' ne 'b'; # not equal
+'a' !eq 'b'; # same as above
+
+### - `eqv` is canonical equivalence
+(1, 2) eqv (1, 3);
+
+### - `~~` is smart matching
+### for a complete combinations list, use this table : http://perlcabal.org/syn/S03.html#Smart_matching
+'a' ~~ /a/; # true if matches regexp
+'key' ~~ %hash; # true if key exists in hash
+$arg ~~ &bool-returning-function; # true if the function, passed `$arg` as an argument, returns True
+1 ~~ Int; # "is of type"
+
+### - `===` is value identity and uses `.WHICH` on the objects to compare them
+### - `=:=` is container identity and uses `VAR()` on the objects to compare them
+
+### You also, of course, have `<`, `<=`, `>`, `>=`.
+### Their string equivalent are also avaiable : `lt`, `le`, `gt`, `ge`.
+3 > 4;
+
+## * Sort comparison
+### They return one value of the `Order` enum : `Less`, `Same` and `More` (which numerify to -1, 0 or +1).
+1 <=> 4; # sort comparison for numerics
+'a' leg 'b'; # sort comparison for string
+$obj eqv $obj2; # sort comparison using eqv semantics
+
+## * Generic ordering
+3 before 4; # True
+'b' after 'a'; # True
+
+## * Range constructors
+3 .. 7; # 3 to 7, both included
+### `^` on either side them exclusive on that side :
+3 ^..^ 7; # 3 to 7, not included (basically `4 .. 6`)
+
+# * And, Or
+
+## Short-circuit (and tight)
+$a && $b && $c; # returns the first argument that evaluates to False, or the last argument
+$a || $b;
```