Extending Operators in Perl with Operator::Util

05bab33cfd102c84f045838aa4e05bec?s=47 Nova Patch
February 15, 2011

Extending Operators in Perl with Operator::Util

NOTE: Operator::Util is an experimental module that is no longer actively maintained.

Presented at:
◦  2011-02-15: Perl Seminar NY (PerlSemNY), New York, NY

05bab33cfd102c84f045838aa4e05bec?s=128

Nova Patch

February 15, 2011
Tweet

Transcript

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

  2. released yesterday

  3. released yesterday i ♥ feedback

  4. Perl 6 is pretty cool

  5. meta-operators

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

  7. reduction [+] 1..4 # 10 [*] 1..4 # 24 [~]

    'a'..'d' # 'abcd'
  8. zip (1,2) Z+ (2,3) # 3,5 (1,2) Z* (2,3) #

    2,6 (1,2) Z~ <a b> # 1a,2b
  9. cross (flat) (1,2) X+ (2,3) # 3,4,4,5 (1,2) X* (2,3)

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

    # [2,3],[4,6] (1,2) X~ <a b> # [1a,1b],[2a,2b]
  11. hyper 1..4 »~« 'a'..'d' # 1a,2b,3c,4d 1..4 »~» 'x' #

    1x,2x,3x,4x 1..4 «~» <x y> # 1x,2y,1x,2y 1..4 «~« <x y> # 1x,2y
  12. more hyper! -« (1,2,3) # -1,-2,-3 [1,[2,3]] »++ # [2,[3,4]]

    %foo «+» %bar # intersection %foo »+« %bar # union %foo »+=« %bar # %foo = union
  13. but it's not Xmas yet

  14. cpanm Operator::Util

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

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

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

    ['a'..'d']) # 'abcd'
  18. zip zipwith('+', [1,2], [2,3]) # 3,5 zipwith('*', [1,2], [2,3]) #

    2,6 zipwith('.', [1,2], ['a','b']) # 1a,2b
  19. 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
  20. 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]
  21. 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
  22. 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
  23. 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
  24. associativity reduce('-', [4, 3, 2]) reduce('**', [4, 3, 2]) #

    4-3-2 = (4-3)-2 = -1 # 4**3**2 = 4**(3**2) = 262144
  25. chaining reduce('eq', \@a) # all elements eq? reduce('!=', \@c) #

    no repeating elements? reduce('<', \@b) # ascending elements?
  26. dwim for < 2 elems reduce('+', [] ) # 0

    reduce('+', [5]) # 5 reduce('*', [] ) # 1 reduce('*', [5]) # 5
  27. 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
  28. resources git: github.com/patch slides: patch.github.com