Slide 1

Slide 1 text

Operator::Util Nick Patch Perl Seminar NY 15 February 2011

Slide 2

Slide 2 text

released yesterday

Slide 3

Slide 3 text

released yesterday i ♥ feedback

Slide 4

Slide 4 text

Perl 6 is pretty cool

Slide 5

Slide 5 text

meta-operators

Slide 6

Slide 6 text

meta-operators [ ] Z X » « ☺ ☺ ☺ ☺

Slide 7

Slide 7 text

reduction [+] 1..4 # 10 [*] 1..4 # 24 [~] 'a'..'d' # 'abcd'

Slide 8

Slide 8 text

zip (1,2) Z+ (2,3) # 3,5 (1,2) Z* (2,3) # 2,6 (1,2) Z~ # 1a,2b

Slide 9

Slide 9 text

cross (flat) (1,2) X+ (2,3) # 3,4,4,5 (1,2) X* (2,3) # 2,3,4,6 (1,2) X~ # 1a,1b,2a,2b

Slide 10

Slide 10 text

cross (lol) (1,2) X+ (2,3) # [3,4],[4,5] (1,2) X* (2,3) # [2,3],[4,6] (1,2) X~ # [1a,1b],[2a,2b]

Slide 11

Slide 11 text

hyper 1..4 »~« 'a'..'d' # 1a,2b,3c,4d 1..4 »~» 'x' # 1x,2x,3x,4x 1..4 «~» # 1x,2y,1x,2y 1..4 «~« # 1x,2y

Slide 12

Slide 12 text

more hyper! -« (1,2,3) # -1,-2,-3 [1,[2,3]] »++ # [2,[3,4]] %foo «+» %bar # intersection %foo »+« %bar # union %foo »+=« %bar # %foo = union

Slide 13

Slide 13 text

but it's not Xmas yet

Slide 14

Slide 14 text

cpanm Operator::Util

Slide 15

Slide 15 text

use Operator::Util qw( reducewith zipwith crosswith hyperwith );

Slide 16

Slide 16 text

reducewith a.k.a. reduce hyperwith a.k.a. hyper

Slide 17

Slide 17 text

reduction reduce('+', [1..4]) # 10 reduce('*', [1..4]) # 24 reduce('.', ['a'..'d']) # 'abcd'

Slide 18

Slide 18 text

zip zipwith('+', [1,2], [2,3]) # 3,5 zipwith('*', [1,2], [2,3]) # 2,6 zipwith('.', [1,2], ['a','b']) # 1a,2b

Slide 19

Slide 19 text

cross (flat) crosswith('+', [1,2], [2,3]) crosswith('*', [1,2], [2,3]) crosswith('.', [1,2], ['a','b']) # 3,4,4,5 # 2,3,4,6 # 1a,1b,2a,2b

Slide 20

Slide 20 text

cross (lol) crosswith('+', [1,2], [2,3], flat=>0) crosswith('*', [1,2], [2,3], flat=>0) crosswith('.', [1,2], ['a','b'], flat=>0) # [3,4],[4,5] # [2,3],[4,6] # [1a,1b],[2a,2b]

Slide 21

Slide 21 text

hyper hyper('.', [1..4], ['a'..'d'] ); hyper('.', [1..4], 'x', dwim_right=>1); hyper('.', [1..4], ['x','y'], dwim=>1 ); hyper('.', [1..4], ['x','y'], dwim_left=>1 ); # 1a,2b,3c,4d # 1x,2x,3x,4x # 1x,2y,1x,2y # 1x,2y

Slide 22

Slide 22 text

more hyper! hyper('prefix:-', [1,2,3]); hyper('postfix:++', [1,[2,3]]); hyper('+', \%foo, \%bar, dwim=>1); hyper('+', \%foo, \%bar); hyper('+=', \%foo, \%bar); # -1,-2,-3 # [2,[3,4]] # intersection # union # %foo = union

Slide 23

Slide 23 text

default ops zipwith(',', [1,2], ['a','b']) zip( [1,2], ['a','b']) crosswith(',', [1,2], ['a','b']) cross( [1,2], ['a','b']) # 1,a,2,b # 1,a,2,b # 1,a,1,b,2,a,2,b # 1,a,1,b,2,a,2,b

Slide 24

Slide 24 text

associativity reduce('-', [4, 3, 2]) reduce('**', [4, 3, 2]) # 4-3-2 = (4-3)-2 = -1 # 4**3**2 = 4**(3**2) = 262144

Slide 25

Slide 25 text

chaining reduce('eq', \@a) # all elements eq? reduce('!=', \@c) # no repeating elements? reduce('<', \@b) # ascending elements?

Slide 26

Slide 26 text

dwim for < 2 elems reduce('+', [] ) # 0 reduce('+', [5]) # 5 reduce('*', [] ) # 1 reduce('*', [5]) # 5

Slide 27

Slide 27 text

even more hyper! hyper('->', \@objects, 'run', dwim=>1) hyper('+', [[1, 2], 3], [4, [5, 6]], dwim=>1) hyper('prefix:-', {a => 1, b => 2, c => 3}) # call ->run() on each # [[5, 6], [8, 9]] # a => -1, b => -2, c => -3

Slide 28

Slide 28 text

resources git: github.com/patch slides: patch.github.com