Pipeline-oriented programming - Scott Wlaschin - NDC Porto 2023 (F#)
Pipeline-oriented programming - Scott Wlaschin - NDC Porto 2023 (F#)
1 comments
Examples from the slides, but in Factor:
USING: kernel math ; IN: pipeline-demo.calc : add1 ( x -- x' ) 1 + ; : square ( x -- x' ) dup * ; : double ( x -- x' ) 2 * ; : demo1 ( -- n ) 5 add1 square double ; : add ( x y -- n ) + ; : times ( x y -- n ) * ; : demo2 ( -- n ) 5 1 add 2 times ;
USING: math sequences sequences.extras ; IN: pipeline-demo.collection : pipeline ( seq -- n ) [ 2 + ] [ 3 > ] map-filter length ;
USING: io kernel math.functions math.parser ranges sequences ; IN: pipeline-demo.fizzbuzz : (fizz-buzz) ( i -- str ) dup [ 3 divisor? ] [ 5 divisor? ] bi 2dup or [ [ "Fizz" "" ? ] [ "Buzz" "" ? ] bi* append nip ] [ 2drop number>string ] if ; : fizz-buzz ( -- ) 35 [1..b] [ (fizz-buzz) ] map "," join print ;
USING: accessors kernel math strings ; IN: pipeline-demo.person TUPLE: Person { Name string read-only } { Email string read-only } { Age integer read-only } ; : person-with-name ( person name -- person' ) swap [ Email>> ] [ Age>> ] bi Person boa ; : person-with-email ( person email -- person' ) swap [ Name>> ] [ Age>> ] bi swapd Person boa ; : person-with-age ( person age -- person' ) swap [ Name>> ] [ Email>> ] bi rot Person boa ; : demo ( -- person ) "Scott" "[email protected]" 21 Person boa "Tom" person-with-name "[email protected]" person-with-email 42 person-with-age ;
USING: sequences splitting strings ; IN: pipeline-demo.roman : >roman-numerals ( n -- str ) CHAR: I "IIIII" "V" replace "VV" "X" replace "XXXXX" "L" replace "LL" "C" replace ! special cases: "VIIII" "IX" replace "IIII" "IV" replace "LXXXX" "XC" replace "XXXX" "XL" replace ; : >roman-numerals-alt ( n -- str ) CHAR: I { { "IIIII" "V" } { "VV" "X" } { "XXXXX" "L" } { "LL" "C" } ! special cases: { "VIIII" "IX" } { "IIII" "IV" } { "LXXXX" "XC" } { "XXXX" "XL" } } [ first2 replace ] each ;
1 0 Reply