149
Programming in handstand PHP Meetup, 2014. 04. 23.

Programming in handstand

Embed Size (px)

DESCRIPTION

An example demonstrating how to have fun while learning new concepts in the art of software development.

Citation preview

Page 1: Programming in handstand

Programming in handstand

PHP Meetup, 2014. 04. 23.

Page 2: Programming in handstand

Programming in handstand

Attila Magyar (@athoshun)http://athoshun.eu

2/149

Page 3: Programming in handstand

Programming in handstand

Attila Magyar (@athoshun)http://athoshun.eu

http://balabit.com

3/149

Page 4: Programming in handstand

Programming in handstand

Attila Magyar (@athoshun)http://athoshun.eu

http://balabit.com

Rafael Ördög (@devillsroom)http://c0de-x.comhttp://leanpoker.org

4/149

Page 5: Programming in handstand

Programming in handstand

Attila Magyar (@athoshun)http://athoshun.eu

http://balabit.com

Rafael Ördög (@devillsroom)http://c0de-x.comhttp://leanpoker.org

http://coderetreat.orghttp://www.meetup.com/Coderetreat-Budapest/

5/149

Page 6: Programming in handstand

Programming in handstand

Attila Magyar (@athoshun)http://athoshun.eu

http://balabit.com

Rafael Ördög (@devillsroom)http://c0de-x.comhttp://leanpoker.org

http://coderetreat.orghttp://www.meetup.com/Coderetreat-Budapest/

Gergely Nagy (@algernoone)http://asylum.madhouse-project.org/http://syslog-ng.org/

6/149

Page 7: Programming in handstand

FizzBuzz

Write a program that iterates through the numbers from 1 to 100 and:

For multiples of 3 print "Fizz" For multiples of 5 print "Buzz" For numbers which are multiples of both 3

and 5 print "FizzBuzz" For others, print the number itself

7/149

Page 8: Programming in handstand

FizzBuzz

Write a program that iterates through the numbers from 1 to 100 and:

For multiples of 3 print "Fizz" For multiples of 5 print "Buzz" For numbers which are multiples of both 3

and 5 print "FizzBuzz" For others, print the number itself

1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz,11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19,Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28,29, FizzBuzz, ...

8/149

Page 9: Programming in handstand

FizzBuzz

for ($i = 0; $i < 100; ++$i) {

if ($i % 3 === 0) { print "Fizz"; } if ($i % 5 === 0) { print "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { print $i; }

print ", "; }

9/149

Page 10: Programming in handstand

FizzBuzz

for ($i = 0; $i < 100; ++$i) {

if ($i % 3 === 0) { print "Fizz"; } if ($i % 5 === 0) { print "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { print $i; }

print ", "; }

10/149

Page 11: Programming in handstand

FizzBuzzfunction fizzbuzz(){ $sequence = array();

for ($i = 0; $i < 100; ++$i) { $formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

11/149

Page 12: Programming in handstand

FizzBuzzfunction fizzbuzz(){ $sequence = array();

for ($i = 0; $i < 100; ++$i) { $formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

12/149

Page 13: Programming in handstand

FizzBuzzfunction fizzbuzz(){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

13/149

Page 14: Programming in handstand

FizzBuzzfunction fizzbuzz(){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

14/149

Page 15: Programming in handstand

FizzBuzzfunction fizzbuzz(){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

15/149

Page 16: Programming in handstand

FizzBuzzBeepfunction fizzbuzz(){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

16/149

Page 17: Programming in handstand

FizzBuzzBeepfunction fizzbuzz($with_beep = false){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0) $formatted .= "Fizz"; if ($i % 5 === 0) $formatted .= "Buzz"; if ($with_beep && $i % 7 === 0) $formatted .= "Beep"; if ($formatted === "") { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

17/149

Page 18: Programming in handstand

FizzBuzzBeepfunction fizzbuzz($with_beep = false, $with_digits = false){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0 || ($with_digits && strpos...)) $formatted .= "Fizz"; if ($i % 5 === 0 || ($with_digits && strpos...)) $formatted .= "Buzz"; if ($with_beep && $i % 7 === 0 || ($with_digits ...)) $formatted .= "Beep"; if ($formatted === "") { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

18/149

Page 19: Programming in handstand

FizzBuzzBeepfunction fizzbuzz($with_beep = false, $with_digits = false){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0 || ($with_digits && strpos...)) $formatted .= "Fizz"; if ($i % 5 === 0 || ($with_digits && strpos...)) $formatted .= "Buzz"; if ($with_beep && $i % 7 === 0 || ($with_digits ...)) $formatted .= "Beep"; if ($formatted === "") { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

19/149

Page 20: Programming in handstand

No loops!20/149

Page 21: Programming in handstand

No loops!21/149

Page 22: Programming in handstand

No loops!function fizzbuzz(){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

22/149

Page 23: Programming in handstand

No loops!function fizzbuzz($i = 1, array $result = array()){ if ($i > 100) return $result;

$formatted = ""; if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted .= "$i"; }

return fizzbuzz( $i + 1, array_merge($result, array($formatted)) );}

23/149

Page 24: Programming in handstand

No loops!function fizzbuzz($i = 1, array $result = array()){ if ($i > 100) return $result;

$formatted = ""; if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted .= "$i"; }

return fizzbuzz( $i + 1, array_merge($result, array($formatted)) );}

PHP Fatal error:  Maximumfunction nesting levelof '100' Reached, aborting!

24/149

Page 25: Programming in handstand

No loops!function fizzbuzz(){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

25/149

Page 26: Programming in handstand

array_map($callable, $array)function fizzbuzz(){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

array_map( function ($x) { return 2*$x; }, array(1, 2, 3));

// array(2, 4, 6)

26/149

Page 27: Programming in handstand

No loops!function fizzbuzz(){ $sequence = array();

for ($i = 1; $i < 101; ++$i) { $formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

$sequence[] = $formatted; }

return $sequence;}

array_map( function ($x) { return 2*$x; }, array(1, 2, 3));

// array(2, 4, 6)

27/149

Page 28: Programming in handstand

No loops!function fizzbuzz(){ return array_map( function ($i) {

$formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

return $formatted; }, range(1, 100) );}

array_map( function ($x) { return 2*$x; }, array(1, 2, 3));

// array(2, 4, 6)

28/149

Page 29: Programming in handstand

No loops!function fizzbuzz(){ return array_map( function ($i) {

$formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

return $formatted; }, range(1, 100) );}

29/149

Page 30: Programming in handstand

Still complex, rigidfunction fizzbuzz($with_beep = false, $with_digits = false){ return array_map( function ($i) use ($with_beep, $with_digits) {

$formatted = "";

if ($i % 3 === 0 || ($with_digits && strpos...)) $formatted .= "Fizz"; if ($i % 5 === 0 || ($with_digits && strpos...)) $formatted .= "Buzz"; if ($with_beep && (...)) $formatted .= "Buzz"; if ($formatted === "") $formatted = "$i";

return $formatted; }, range(1, 100) );}

30/149

Page 31: Programming in handstand

No conditional statements!function fizzbuzz(){ return array_map( function ($i) {

$formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

return $formatted; }, range(1, 100) );}

31/149

Page 32: Programming in handstand

Create some duplicationfunction fizzbuzz(){ return array_map( function ($i) {

$formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

return $formatted; }, range(1, 100) );}

32/149

Page 33: Programming in handstand

Create some duplicationfunction fizzbuzz(){ return array_map( function ($i) {

$formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }

return $formatted; }, range(1, 100) );}

33/149

Page 34: Programming in handstand

Uniformizefunction fizzbuzz(){ return array_map( function ($i) {

$formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted .= "$i"; }

return $formatted; }, range(1, 100) );}

34/149

Page 35: Programming in handstand

Scalar vector→function fizzbuzz(){ return array_map( function ($i) {

$formatted = "";

if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted .= "$i"; }

return $formatted; }, range(1, 100) );}

35/149

Page 36: Programming in handstand

Scalar vector→function fizzbuzz(){ return array_map( function ($i) {

$formatted = array();

if ($i % 3 === 0) { $formatted[] = "Fizz"; } if ($i % 5 === 0) { $formatted[] = "Buzz"; } if (count($formatted) === 0) { $formatted[] = "$i"; }

return implode($formatted); }, range(1, 100) );}

36/149

Page 37: Programming in handstand

Extract conditionfunction fizzbuzz(){ return array_map( function ($i) {

$formatted = array();

if ($i % 3 === 0) { $formatted[] = "Fizz"; } if ($i % 5 === 0) { $formatted[] = "Buzz"; } if (count($formatted) === 0) { $formatted[] = "$i"; }

return implode($formatted); }, range(1, 100) );}

37/149

Page 38: Programming in handstand

Extract conditionfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $condition = $i % 3 === 0; if ($condition) { $formatted[] = "Fizz"; } $condition = $i % 5 === 0; if ($condition) { $formatted[] = "Buzz"; } $condition = count($formatted) === 0; if ($condition) { $formatted[] = "$i"; } return implode($formatted); }, range(1, 100) );}

38/149

Page 39: Programming in handstand

Extract representationfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $condition = $i % 3 === 0; if ($condition) { $formatted[] = "Fizz"; } $condition = $i % 5 === 0; if ($condition) { $formatted[] = "Buzz"; } $condition = count($formatted) === 0; if ($condition) { $formatted[] = "$i"; } return implode($formatted); }, range(1, 100) );}

39/149

Page 40: Programming in handstand

Extract representationfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $condition = $i % 3 === 0; $representation = "Fizz"; if ($condition) $formatted[] = $representation;

$condition = $i % 5 === 0; $representation = "Buzz"; if ($condition) $formatted[] = $representation;

$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

40/149

Page 41: Programming in handstand

Eliminate duplicationfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $condition = $i % 3 === 0; $representation = "Fizz"; if ($condition) $formatted[] = $representation;

$condition = $i % 5 === 0; $representation = "Buzz"; if ($condition) $formatted[] = $representation;

$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

41/149

Page 42: Programming in handstand

Eliminate duplicationfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $condition = $i % 3 === 0; $representation = "Fizz"; if ($condition) $formatted[] = $representation;

$condition = $i % 5 === 0; $representation = "Buzz"; if ($condition) $formatted[] = $representation;

$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

42/149

Page 43: Programming in handstand

Eliminate duplicationfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"));

foreach ($rules as $rule) { list($condition, $representation) = $rule; if ($condition) $formatted[] = $representation; }

$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

43/149

Page 44: Programming in handstand

array_filter($array, $callable)function fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"));

foreach ($rules as $rule) { list($condition, $representation) = $rule; if ($condition) $formatted[] = $representation; }

$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

array_filter(array(1, 2, 3, 4), function ($x) { return $x > 2; });

// array(3, 4)

44/149

Page 45: Programming in handstand

Eliminate conditionalfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"));

foreach ($rules as $rule) { list($condition, $representation) = $rule; if ($condition) $formatted[] = $representation; }

$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

45/149

Page 46: Programming in handstand

Eliminate conditionalfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array_filter( array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz")), function (array $rule) { return $rule[0]; }); foreach ($rules as $rule) { list($condition, $representation) = $rule; $formatted[] = $representation; } $condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

46/149

Page 47: Programming in handstand

Remove some noisefunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array_filter( array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz")), function (array $rule) { return $rule[0]; }); foreach ($rules as $rule) { list($condition, $representation) = $rule; $formatted[] = $representation; } $condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

47/149

Page 48: Programming in handstand

Remove some noisefunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array_filter( array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz")), function (array $rule) { return $rule[0]; }); foreach ($rules as $rule) {

$formatted[] = $rule[1]; } $condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

48/149

Page 49: Programming in handstand

Remove some noisefunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array_filter( array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz")), function (array $rule) { return $rule[0]; }); foreach ($rules as $rule) {

$formatted[] = $rule[1]; } $condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

49/149

Page 50: Programming in handstand

Zoom infunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array_filter( array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz")), function (array $rule) { return $rule[0]; }); foreach ($rules as $rule) {

$formatted[] = $rule[1]; } $condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;

return implode($formatted); }, range(1, 100) );}

50/149

Page 51: Programming in handstand

Zoom in$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

foreach ($rules as $rule) { $formatted[] = $rule[1];}

$condition = count($formatted) === 0;$representation = "$i";if ($condition) { $formatted[] = $representation;}

return implode($formatted);

51/149

Page 52: Programming in handstand

$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

foreach ($rules as $rule) { $formatted[] = $rule[1];}

$condition = count($formatted) === 0;$representation = "$i";if ($condition) { $formatted[] = $representation;}

return implode($formatted);

52/149

Page 53: Programming in handstand

$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

foreach ($rules as $rule) { $formatted[] = $rule[1];}

$condition = count($rules) === 0;$representation = "$i";if ($condition) { $formatted[] = $representation;}

return implode($formatted);

53/149

Page 54: Programming in handstand

Uniformize$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

foreach ($rules as $rule) { $formatted[] = $rule[1];}

$condition = count($rules) === 0;$representation = "$i";if ($condition) { $formatted[] = $representation;}

return implode($formatted);

54/149

Page 55: Programming in handstand

Uniformize$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

foreach ($rules as $rule) { $formatted[] = $rule[1];}

$rule = array(count($rules) === 0, "$i");

if ($rule[0]) { $formatted[] = $rule[1];}

return implode($formatted);

55/149

Page 56: Programming in handstand

$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

foreach ($rules as $rule) { $formatted[] = $rule[1];}

$rule = array(count($rules) === 0, "$i");

if ($rule[0]) { $formatted[] = $rule[1];}

return implode($formatted);

56/149

Page 57: Programming in handstand

$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

foreach ($rules as $rule) { $formatted[] = $rule[1];}

if (count($rules) === 0) { $rules[] = array(count($rules) === 0, "$i");}

return implode($formatted);

57/149

Page 58: Programming in handstand

$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

foreach ($rules as $rule) { $formatted[] = $rule[1];}

if (count($rules) === 0) { $rules[] = array(count($rules) === 0, "$i");}

return implode($formatted);

58/149

Page 59: Programming in handstand

$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

if (count($rules) === 0) { $rules[] = array(count($rules) === 0, "$i");}

foreach ($rules as $rule) { $formatted[] = $rule[1];}

return implode($formatted);

59/149

Page 60: Programming in handstand

Remove some redundancy$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

if (count($rules) === 0) { $rules[] = array(count($rules) === 0, "$i");}

foreach ($rules as $rule) { $formatted[] = $rule[1];}

return implode($formatted);

60/149

Page 61: Programming in handstand

Remove some redundancy$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

if (count($rules) === 0) { $rules[] = array(true, "$i");}

foreach ($rules as $rule) { $formatted[] = $rule[1];}

return implode($formatted);

61/149

Page 62: Programming in handstand

array_pad($array, $size, $value)$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

if (count($rules) === 0) { $rules[] = array(true, "$i");}

foreach ($rules as $rule) { $formatted[] = $rule[1];}

return implode($formatted);

array_pad(array(1, 2), 5, 42); // array(1, 2, 42, 42, 42)

array_pad(array(1, 2), 1, 42); // array(1, 2)

62/149

Page 63: Programming in handstand

array_pad(array(1, 2), 5, 42); // array(1, 2, 42, 42, 42)

array_pad(array(1, 2), 1, 42); // array(1, 2)

Padding$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

if (count($rules) === 0) { $rules[] = array(true, "$i");}

foreach ($rules as $rule) { $formatted[] = $rule[1];}

return implode($formatted);

63/149

Page 64: Programming in handstand

Padding$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });

if (count($rules) === 0) { $rules[] = array(true, "$i");}

foreach ($rules as $rule) { $formatted[] = $rule[1];}

return implode($formatted);

64/149

Page 65: Programming in handstand

Padding$formatted = array();$rules = array_pad(array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i"));

foreach ($rules as $rule) { $formatted[] = $rule[1];}

return implode($formatted);

65/149

Page 66: Programming in handstand

Padding$formatted = array();$rules = array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i"));

foreach ($rules as $rule) { $formatted[] = $rule[1];}

return implode($formatted);

66/149

Page 67: Programming in handstand

foreach array_map()→$formatted = array();$rules = array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i"));

foreach ($rules as $rule) { $formatted[] = $rule[1];}

return implode($formatted);

67/149

Page 68: Programming in handstand

foreach array_map()→$formatted = array_map(function(array $rule){return $rule[1];}, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i")));

return implode($formatted);

68/149

Page 69: Programming in handstand

foreach array_map→$formatted = array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") ));

return implode($formatted);

69/149

Page 70: Programming in handstand

inline implode$formatted = array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") ));

return implode($formatted);

70/149

Page 71: Programming in handstand

inline implodereturn implode(array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") )));

71/149

Page 72: Programming in handstand

inline implodereturn implode( array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") ) ));

72/149

Page 73: Programming in handstand

Eliminate unneeded valuesreturn implode( array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") ) ));

73/149

Page 74: Programming in handstand

array_pad() array_map()↔return implode( array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") ) ));

74/149

Page 75: Programming in handstand

array_pad() array_map()↔return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));

75/149

Page 76: Programming in handstand

array_map() for_all()→return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));

76/149

Page 77: Programming in handstand

array_map() for_all()→

return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));

77/149

Page 78: Programming in handstand

array_map() for_all()→

return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));

78/149

Page 79: Programming in handstand

array_map() for_all()→

return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));

79/149

Page 80: Programming in handstand

array_map() for_all()→

return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));

80/149

Page 81: Programming in handstand

array_map() for_all()→

return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));

81/149

Page 82: Programming in handstand

array_map() for_all()→

return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));

82/149

Page 83: Programming in handstand

array_map() for_all()→function for_all(array $items, $action){ return array_map($action, $items);}

return implode( array_pad( for_all(

array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), function (array $rule) { return $rule[1]; } ), 1, "$i" ));

83/149

Page 84: Programming in handstand

array_filter matching_rules→function for_all(array $items, $action){ return array_map($action, $items);}

return implode( array_pad( for_all(

array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), function (array $rule) { return $rule[1]; } ), 1, "$i" ));

84/149

Page 85: Programming in handstand

array_filter matching_rules→function matching_rules(array $rules) { return array_filter( $rules, function (array $rule) { return $rule[0]; }); }

return implode( array_pad( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), function (array $rule) { return $rule[1]; } ), 1, "$i" ));

85/149

Page 86: Programming in handstand

For all matching rules...function matching_rules(array $rules) { return array_filter( $rules, function (array $rule) { return $rule[0]; }); }

return implode( array_pad( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), function (array $rule) { return $rule[1]; } ), 1, "$i" ));

86/149

Page 87: Programming in handstand

select representation

return implode( array_pad( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), function (array $rule) { return $rule[1]; } ), 1, "$i" ));

87/149

Page 88: Programming in handstand

select representation$select_representation = function (array $rule) { return $rule[1]; };

return implode( array_pad( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), $select_representation ), 1, "$i" ));

88/149

Page 89: Programming in handstand

select representationfunction select_representation(){ return function (array $rule) { return $rule[1]; };}

return implode( array_pad( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), select_representation() ), 1, "$i" ));

89/149

Page 90: Programming in handstand

array_pad() either_or_else()→function select_representation(){ return function (array $rule) { return $rule[1]; };}

return implode( array_pad( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), select_representation() ), 1, "$i" ));

90/149

Page 91: Programming in handstand

array_pad() either_or_else()→function either_or_else(array $either, $or_else){ return array_pad($either, 1, $or_else);}

return implode( either_or_else( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), select_representation() ),

"$i" ));

91/149

Page 92: Programming in handstand

implode() concat()→function either_or_else(array $either, $or_else){ return array_pad($either, 1, $or_else);}

return implode( either_or_else( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), select_representation() ),

"$i" ));

92/149

Page 93: Programming in handstand

implode() concat()→function concat(array $parts){ return implode($parts);}

return concat( either_or_else( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), select_representation() ),

"$i" ));

93/149

Page 94: Programming in handstand

Parametric rules: conditionsfunction concat(array $parts){ return implode($parts);}

return concat( either_or_else( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), select_representation() ),

"$i" ));

94/149

Page 95: Programming in handstand

Parametric rules: conditionsfunction matching_rules(array $rules) { return array_filter( $rules, function (array $rule) { return $rule[0]; }); }

return concat( either_or_else( for_all(

matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )

), select_representation() ),

"$i" ));

95/149

Page 96: Programming in handstand

Parametric rules: conditionsfunction matching_rules($n, array $rules) { return array_filter( $rules, function (array $rule) use ($n) {return $rule[0]($n);});}

return concat( either_or_else( for_all( matching_rules( $i, array( array(function ($n) { return $n%3 === 0; }, "Fizz"), array(function ($n) { return $n%5 === 0; }, "Buzz"), ) ), select_representation() ), "$i" ));

96/149

Page 97: Programming in handstand

Remove duplicationfunction matching_rules($n, array $rules) { return array_filter( $rules, function (array $rule) use ($n) {return $rule[0]($n);});}

return concat( either_or_else( for_all( matching_rules( $i, array( array(function ($n) { return $n%3 === 0; }, "Fizz"), array(function ($n) { return $n%5 === 0; }, "Buzz"), ) ), select_representation() ), "$i" ));

97/149

Page 98: Programming in handstand

Remove duplicationfunction is_multiple_of($divisor) { return function ($n) use ($divisor) { return $n % $divisor === 0; };}

return concat( either_or_else( for_all( matching_rules( $i, array( array(is_multiple_of(3), "Fizz"), array(is_multiple_of(5), "Buzz"), ) ), select_representation() ), "$i" ));

98/149

Page 99: Programming in handstand

Parametric representationfunction is_multiple_of($divisor) { return function ($n) use ($divisor) { return $n % $divisor === 0; };}

return concat( either_or_else( for_all( matching_rules( $i, array( array(is_multiple_of(3), "Fizz"), array(is_multiple_of(5), "Buzz"), ) ), select_representation() ), "$i" ));

99/149

Page 100: Programming in handstand

Parametric representation

return concat( either_or_else( for_all( matching_rules( $i, array( array(is_multiple_of(3), function ($n) { return "Fizz"; }), array(is_multiple_of(5), function ($n) { return "Buzz"; }), ) ), select_representation() ), function ($n) { return "$n"; } ));

100/149

Page 101: Programming in handstand

Parametric representation

return concat(for_all( either_or_else( for_all( matching_rules( $i, array( array(is_multiple_of(3), function ($n) { return "Fizz"; }), array(is_multiple_of(5), function ($n) { return "Buzz"; }), ) ), select_representation() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); }));

101/149

Page 102: Programming in handstand

Parametric representation

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_representation() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); } ));

102/149

Page 103: Programming in handstand

Parametric actionfunction select_representation() { return function (array $rule) { return $rule[1]; };}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_representation() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); } ));

103/149

Page 104: Programming in handstand

Parametric actionfunction select_action() { return function (array $rule) { return $rule[1]; };}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); } ));

104/149

Page 105: Programming in handstand

Parametric actionfunction select_action() { return function (array $rule) { return $rule[1]; };}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); } ));

105/149

Page 106: Programming in handstand

Parametric action

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); } ));

106/149

Page 107: Programming in handstand

Parametric actionfunction apply_with($n) { return function ($f) use ($n) { return $f($n); };}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), apply_with($i) ));

107/149

Page 108: Programming in handstand

Parametric actionfunction apply_with($n) { return function ($f) use ($n) { return $f($n); };}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), apply_with($i) ));

108/149

Page 109: Programming in handstand

Remove duplication

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), apply_with($i) ));

109/149

Page 110: Programming in handstand

Remove duplicationfunction const_fn($const) { return function ($n) use ($const) { return $const; };}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), const_fn("Fizz")), array(is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), function ($n) { return "$n"; } ), apply_with($i) ));

110/149

Page 111: Programming in handstand

Name thingsfunction const_fn($const) { return function ($n) use ($const) { return $const; };}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), const_fn("Fizz")), array(is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), function ($n) { return "$n"; } ), apply_with($i) ));

111/149

Page 112: Programming in handstand

Name thingsfunction to_string() { return function ($n) { return "$n"; };}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), const_fn("Fizz")), array(is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), to_string() ), apply_with($i) ));

112/149

Page 113: Programming in handstand

Encapsulationfunction to_string() { return function ($n) { return "$n"; };}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), const_fn("Fizz")), array(is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), to_string() ), apply_with($i) ));

113/149

Page 114: Programming in handstand

Encapsulationfunction when($condition, $action) { return array($condition, $action);}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(when( is_multiple_of(3), const_fn("Fizz")), when( is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), to_string() ), apply_with($i) ));

114/149

Page 115: Programming in handstand

When ... then ...function when($condition, $action) { return array($condition, $action);}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(when( is_multiple_of(3), const_fn("Fizz")), when( is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), to_string() ), apply_with($i) ));

115/149

Page 116: Programming in handstand

When ... then ...function then($action) { return $action;}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(when( is_multiple_of(3), then(const_fn("Fizz"))), when( is_multiple_of(5), then(const_fn("Buzz"))),) ), select_action() ), to_string() ), apply_with($i) ));

116/149

Page 117: Programming in handstand

Extract ugly detailsfunction then($action) { return $action;}

return concat( for_all( either_or_else( for_all( matching_rules( $i, array(when( is_multiple_of(3), then(const_fn("Fizz"))), when( is_multiple_of(5), then(const_fn("Buzz"))),) ), select_action() ), to_string() ), apply_with($i) ));

117/149

Page 118: Programming in handstand

Extract ugly detailsfunction apply_rules($n, array $rules, $otherwise_fn){ return concat( for_all( either_or_else( for_all(matching_rules($n, $rules), select_action()), $otherwise_fn ), apply_with($n) ) );}

return apply_rules( $i, array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string());

118/149

Page 119: Programming in handstand

Extract ugly detailsfunction apply_rules($n, array $rules, $otherwise_fn){ return concat( for_all( either_or_else( for_all(matching_rules($n, $rules), select_action()), $otherwise_fn ), apply_with($n) ) );}

return apply_rules( $i, array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string());

119/149

Page 120: Programming in handstand

Extract ugly details

function fizzbuzz(){ return for_all( range(1, 100), function ($i) { apply_rules( $i, array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string() ) } );}

120/149

Page 121: Programming in handstand

Extract ugly details

function fizzbuzz(){ return for_all( range(1, 100), function ($i) { apply_rules( $i, array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string() ) } );}

121/149

Page 122: Programming in handstand

Extract ugly detailsfunction apply_rules(array $rules, $otherwise_fn) { return function ($n) use ($rules, $otherwise_fn) { return concat(for_all( ... )); };}function fizzbuzz(){ return for_all( range(1, 100), apply_rules(

array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string() )

);}

122/149

Page 123: Programming in handstand

Readability refinementsfunction apply_rules(array $rules, $otherwise_fn) { return function ($n) use ($rules, $otherwise_fn) { return concat(for_all( ... )); };}function fizzbuzz(){ return for_all( range(1, 100), apply_rules(

array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string() )

);}

123/149

Page 124: Programming in handstand

Readability refinementsfunction otherwise($action) { return $action;}

function fizzbuzz(){ return for_all( range(1, 100), apply_rules(

array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), otherwise(to_string()) )

);}

124/149

Page 125: Programming in handstand

Readability refinementsfunction otherwise($action) { return $action;}

function fizzbuzz(){ return for_all( range(1, 100), apply_rules(

array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), otherwise(to_string()) )

);}

125/149

Page 126: Programming in handstand

Readability refinementsfunction otherwise($action) { return $action;}

function fizzbuzz(){ return for_all( range(1, 100), apply_rules(

array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), otherwise(convert_to_string()) )

);}

126/149

Page 127: Programming in handstand

Extract, extract, extract

function fizzbuzz(){ return for_all( range(1, 100), apply_rules(

array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), otherwise(convert_to_string()) )

);}

127/149

Page 128: Programming in handstand

Extract, extract, extractfunction format_numbers(array $rules) { return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz(){ return

array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), )

;}

128/149

Page 129: Programming in handstand

The resulting algorithmfunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz(){ return array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), );}

129/149

Page 130: Programming in handstand

The resulting algorithmfunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz(){ return array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), );}

130/149

Page 131: Programming in handstand

The resulting algorithmfunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

131/149

Page 132: Programming in handstand

The resulting algorithmfunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

132/149

Page 133: Programming in handstand

The resulting algorithmfunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}function rules(){ return func_get_args();}

133/149

Page 134: Programming in handstand

SOLID: Open/Closed Principlefunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}

134/149

Page 135: Programming in handstand

SOLID: Open/Closed Principlefunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzzbeep_rules(){ return append( fizzbuzz_rules(), when(is_multiple_of(7), then(const_fn("Beep"))) );}

135/149

Page 136: Programming in handstand

SOLID: Open/Closed Principlefunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzzbeep_rules(){ return append( fizzbuzz_rules(), when(is_multiple_of(7), then(const_fn("Beep"))) );}function append(array $array, $item) { ... }

136/149

Page 137: Programming in handstand

SOLID: What about the others?function format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

137/149

Page 138: Programming in handstand

SOLID: Single Responsibilityfunction format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

138/149

Page 139: Programming in handstand

SOLID: Single Responsibility ✓function format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

139/149

Page 140: Programming in handstand

SOLID: Liskov Substitutionfunction format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

140/149

Page 141: Programming in handstand

SOLID: Liskov Substitution ✓function format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

141/149

Page 142: Programming in handstand

SOLID: Interface Segregationfunction format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

142/149

Page 143: Programming in handstand

SOLID: Interface Segregation ✓function format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

143/149

Page 144: Programming in handstand

SOLID: Dependency Inversionfunction format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

144/149

Page 145: Programming in handstand

SOLID: Dependency Inversion ✓function format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}

145/149

Page 146: Programming in handstand

Wait a sec: isn't SOLID for OOP?146/149

Page 147: Programming in handstand

Wait a sec: isn't SOLID for OOP?

If you have OO, you can have FP: Iterator Lazy evaluation→ Iterator, Command Map, Filter→ Command, Factory High order functions→ Immutability Composition Over Inheritance

147/149

Page 148: Programming in handstand

Get out of your comfort zone

And extend your mental toolbox!

Page 149: Programming in handstand

Thank you!