Pooh program example 18-higher-order-func-lib2.p
# Higher order functions fold/filter/map - use built in library implementation. sub recsum( num ) if (num > 0) return recsum( ~num num - 1 ) + num else return 0 end end sub sum( a, b ) return recsum( ~num a ) + recsum( ~num b ) end sub sumsqr( a, b ) a = recsum(~num a ) b = recsum(~num b ) return a * a + b end sub even( arg ) # recsum( ~num arg * arg ) return arg % 2 == 0 end sub square( arg ) arg = recsum( ~num arg ) return arg * arg end # -------------------------------- a = [ 1, 2, 3] println( ~msg 'fold right - sum: ' .. foldlast2first( ~array a ~func sum ~initval 0 ) ) println( ~msg 'fold left - sum: ' .. foldfirst2last( ~array a ~func sum ~initval 0 ) ) println( ~msg 'filter - filter odd numbers: ' .. filtercopy( ~array a ~func even ) ) println( ~msg '*** map - square root of numbers ***' ) sqa = mapcopy( ~array a ~func square ) for v sqa println( ~msg v ) end println( ~msg '*** mapreplace - add one to array ***' ) mapreplace( ~array sqa ~func sub (arg) return 1 + arg end ) for v sqa println( ~msg v ) end
fold right - sum: 301 fold left - sum: 16 filter - filter odd numbers: [ -> 2 ] *** map - square root of numbers *** 1 9 36 *** mapreplace - add one to array *** 2 10 37Trace output for 18-higher-order-func-lib2.p
035|a = [ 1 , 2 , 3] 037|println( ~msg 'fold right - sum: ' .. foldlast2first( ~array a:[ -> 1, -> 2, -> 3 ] ~func sub sum(~a , ~b) ~initval 0 )... 013| sub sum(~a , ~b) 014| return (recsum( ~num a:-> 3 )... 005| if (num:-> 3 > 0):true 006| return (recsum( ~num (num:-> 3 - 1):2 )... 005| if (num:2 > 0):true 006| return (recsum( ~num (num:2 - 1):1 )... 005| if (num:1 > 0):true 006| return (recsum( ~num (num:1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:1 - 1):0 ):0 + num:1):1 006| end # if 006| return (recsum( ~num (num:2 - 1):1 ):1 + num:2):3 006| end # if 006| return (recsum( ~num (num:-> 3 - 1):2 ):3 + num:-> 3):6 006| end # if 014| return (recsum( ~num a:-> 3 ):6 + recsum( ~num b:-> 0 )... 005| if (num:-> 0 > 0):false 006| else 008| return 0 008| end # if 014| return (recsum( ~num a:-> 3 ):6 + recsum( ~num b:-> 0 ):0):6 013| end 013| sub sum(~a , ~b) 014| return (recsum( ~num a:-> 2 )... 005| if (num:-> 2 > 0):true 006| return (recsum( ~num (num:-> 2 - 1):1 )... 005| if (num:1 > 0):true 006| return (recsum( ~num (num:1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:1 - 1):0 ):0 + num:1):1 006| end # if 006| return (recsum( ~num (num:-> 2 - 1):1 ):1 + num:-> 2):3 006| end # if 014| return (recsum( ~num a:-> 2 ):3 + recsum( ~num b:-> 6 )... 005| if (num:-> 6 > 0):true 006| return (recsum( ~num (num:-> 6 - 1):5 )... 005| if (num:5 > 0):true 006| return (recsum( ~num (num:5 - 1):4 )... 005| if (num:4 > 0):true 006| return (recsum( ~num (num:4 - 1):3 )... 005| if (num:3 > 0):true 006| return (recsum( ~num (num:3 - 1):2 )... 005| if (num:2 > 0):true 006| return (recsum( ~num (num:2 - 1):1 )... 005| if (num:1 > 0):true 006| return (recsum( ~num (num:1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:1 - 1):0 ):0 + num:1):1 006| end # if 006| return (recsum( ~num (num:2 - 1):1 ):1 + num:2):3 006| end # if 006| return (recsum( ~num (num:3 - 1):2 ):3 + num:3):6 006| end # if 006| return (recsum( ~num (num:4 - 1):3 ):6 + num:4):10 006| end # if 006| return (recsum( ~num (num:5 - 1):4 ):10 + num:5):15 006| end # if 006| return (recsum( ~num (num:-> 6 - 1):5 ):15 + num:-> 6):21 006| end # if 014| return (recsum( ~num a:-> 2 ):3 + recsum( ~num b:-> 6 ):21):24 013| end 013| sub sum(~a , ~b) 014| return (recsum( ~num a:-> 1 )... 005| if (num:-> 1 > 0):true 006| return (recsum( ~num (num:-> 1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:-> 1 - 1):0 ):0 + num:-> 1):1 006| end # if 014| return (recsum( ~num a:-> 1 ):1 + recsum( ~num b:-> 24 )... 005| if (num:-> 24 > 0):true 006| return (recsum( ~num (num:-> 24 - 1):23 )... 005| if (num:23 > 0):true 006| return (recsum( ~num (num:23 - 1):22 )... 005| if (num:22 > 0):true 006| return (recsum( ~num (num:22 - 1):21 )... 005| if (num:21 > 0):true 006| return (recsum( ~num (num:21 - 1):20 )... 005| if (num:20 > 0):true 006| return (recsum( ~num (num:20 - 1):19 )... 005| if (num:19 > 0):true 006| return (recsum( ~num (num:19 - 1):18 )... 005| if (num:18 > 0):true 006| return (recsum( ~num (num:18 - 1):17 )... 005| if (num:17 > 0):true 006| return (recsum( ~num (num:17 - 1):16 )... 005| if (num:16 > 0):true 006| return (recsum( ~num (num:16 - 1):15 )... 005|>> >>if (num:15 > 0):true 006|>> >>return (recsum( ~num (num:15 - 1):14 )... 005|>> >>if (num:14 > 0):true 006|>> >>return (recsum( ~num (num:14 - 1):13 )... 005|>> >>if (num:13 > 0):true 006|>> >>return (recsum( ~num (num:13 - 1):12 )... 005|>> >>if (num:12 > 0):true 006|>> >>return (recsum( ~num (num:12 - 1):11 )... 005|>> >>if (num:11 > 0):true 006|>> >>return (recsum( ~num (num:11 - 1):10 )... 005|>> >>if (num:10 > 0):true 006|>> >>return (recsum( ~num (num:10 - 1):9 )... 005|>> >>if (num:9 > 0):true 006|>> >>return (recsum( ~num (num:9 - 1):8 )... 005|>> >>if (num:8 > 0):true 006|>> >>return (recsum( ~num (num:8 - 1):7 )... 005|>> >>if (num:7 > 0):true 006|>> >>return (recsum( ~num (num:7 - 1):6 )... 005|>> >>if (num:6 > 0):true 006|>> >>return (recsum( ~num (num:6 - 1):5 )... 005|>> >>if (num:5 > 0):true 006|>> >>return (recsum( ~num (num:5 - 1):4 )... 005|>> >>if (num:4 > 0):true 006|>> >>return (recsum( ~num (num:4 - 1):3 )... 005|>> >>if (num:3 > 0):true 006|>> >>return (recsum( ~num (num:3 - 1):2 )... 005|>> >>if (num:2 > 0):true 006|>> >>return (recsum( ~num (num:2 - 1):1 )... 005|>> >>if (num:1 > 0):true 006|>> >>return (recsum( ~num (num:1 - 1):0 )... 005|>> >>if (num:0 > 0):false 006|>> >>else 008|>> >>return 0 008|>> >>end # if 006|>> >>return (recsum( ~num (num:1 - 1):0 ):0 + num:1):1 006|>> >>end # if 006|>> >>return (recsum( ~num (num:2 - 1):1 ):1 + num:2):3 006|>> >>end # if 006|>> >>return (recsum( ~num (num:3 - 1):2 ):3 + num:3):6 006|>> >>end # if 006|>> >>return (recsum( ~num (num:4 - 1):3 ):6 + num:4):10 006|>> >>end # if 006|>> >>return (recsum( ~num (num:5 - 1):4 ):10 + num:5):15 006|>> >>end # if 006|>> >>return (recsum( ~num (num:6 - 1):5 ):15 + num:6):21 006|>> >>end # if 006|>> >>return (recsum( ~num (num:7 - 1):6 ):21 + num:7):28 006|>> >>end # if 006|>> >>return (recsum( ~num (num:8 - 1):7 ):28 + num:8):36 006|>> >>end # if 006|>> >>return (recsum( ~num (num:9 - 1):8 ):36 + num:9):45 006|>> >>end # if 006|>> >>return (recsum( ~num (num:10 - 1):9 ):45 + num:10):55 006|>> >>end # if 006|>> >>return (recsum( ~num (num:11 - 1):10 ):55 + num:11):66 006|>> >>end # if 006|>> >>return (recsum( ~num (num:12 - 1):11 ):66 + num:12):78 006|>> >>end # if 006|>> >>return (recsum( ~num (num:13 - 1):12 ):78 + num:13):91 006|>> >>end # if 006|>> >>return (recsum( ~num (num:14 - 1):13 ):91 + num:14):105 006|>> >>end # if 006|>> >>return (recsum( ~num (num:15 - 1):14 ):105 + num:15):120 006|>> >>end # if 006| return (recsum( ~num (num:16 - 1):15 ):120 + num:16):136 006| end # if 006| return (recsum( ~num (num:17 - 1):16 ):136 + num:17):153 006| end # if 006| return (recsum( ~num (num:18 - 1):17 ):153 + num:18):171 006| end # if 006| return (recsum( ~num (num:19 - 1):18 ):171 + num:19):190 006| end # if 006| return (recsum( ~num (num:20 - 1):19 ):190 + num:20):210 006| end # if 006| return (recsum( ~num (num:21 - 1):20 ):210 + num:21):231 006| end # if 006| return (recsum( ~num (num:22 - 1):21 ):231 + num:22):253 006| end # if 006| return (recsum( ~num (num:23 - 1):22 ):253 + num:23):276 006| end # if 006| return (recsum( ~num (num:-> 24 - 1):23 ):276 + num:-> 24):300 006| end # if 014| return (recsum( ~num a:-> 1 ):1 + recsum( ~num b:-> 24 ):300):301 013| end 037|println( ~msg 'fold right - sum: ' .. foldlast2first( ~array a:[ -> 1, -> 2, -> 3 ] ~func sub sum(~a , ~b) ~initval 0 ):301 )... 038|println( ~msg 'fold left - sum: ' .. foldfirst2last( ~array a:[ -> 1, -> 2, -> 3 ] ~func sub sum(~a , ~b) ~initval 0 )... 013| sub sum(~a , ~b) 014| return (recsum( ~num a:-> 1 )... 005| if (num:-> 1 > 0):true 006| return (recsum( ~num (num:-> 1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:-> 1 - 1):0 ):0 + num:-> 1):1 006| end # if 014| return (recsum( ~num a:-> 1 ):1 + recsum( ~num b:-> 0 )... 005| if (num:-> 0 > 0):false 006| else 008| return 0 008| end # if 014| return (recsum( ~num a:-> 1 ):1 + recsum( ~num b:-> 0 ):0):1 013| end 013| sub sum(~a , ~b) 014| return (recsum( ~num a:-> 2 )... 005| if (num:-> 2 > 0):true 006| return (recsum( ~num (num:-> 2 - 1):1 )... 005| if (num:1 > 0):true 006| return (recsum( ~num (num:1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:1 - 1):0 ):0 + num:1):1 006| end # if 006| return (recsum( ~num (num:-> 2 - 1):1 ):1 + num:-> 2):3 006| end # if 014| return (recsum( ~num a:-> 2 ):3 + recsum( ~num b:-> 1 )... 005| if (num:-> 1 > 0):true 006| return (recsum( ~num (num:-> 1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:-> 1 - 1):0 ):0 + num:-> 1):1 006| end # if 014| return (recsum( ~num a:-> 2 ):3 + recsum( ~num b:-> 1 ):1):4 013| end 013| sub sum(~a , ~b) 014| return (recsum( ~num a:-> 3 )... 005| if (num:-> 3 > 0):true 006| return (recsum( ~num (num:-> 3 - 1):2 )... 005| if (num:2 > 0):true 006| return (recsum( ~num (num:2 - 1):1 )... 005| if (num:1 > 0):true 006| return (recsum( ~num (num:1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:1 - 1):0 ):0 + num:1):1 006| end # if 006| return (recsum( ~num (num:2 - 1):1 ):1 + num:2):3 006| end # if 006| return (recsum( ~num (num:-> 3 - 1):2 ):3 + num:-> 3):6 006| end # if 014| return (recsum( ~num a:-> 3 ):6 + recsum( ~num b:-> 4 )... 005| if (num:-> 4 > 0):true 006| return (recsum( ~num (num:-> 4 - 1):3 )... 005| if (num:3 > 0):true 006| return (recsum( ~num (num:3 - 1):2 )... 005| if (num:2 > 0):true 006| return (recsum( ~num (num:2 - 1):1 )... 005| if (num:1 > 0):true 006| return (recsum( ~num (num:1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:1 - 1):0 ):0 + num:1):1 006| end # if 006| return (recsum( ~num (num:2 - 1):1 ):1 + num:2):3 006| end # if 006| return (recsum( ~num (num:3 - 1):2 ):3 + num:3):6 006| end # if 006| return (recsum( ~num (num:-> 4 - 1):3 ):6 + num:-> 4):10 006| end # if 014| return (recsum( ~num a:-> 3 ):6 + recsum( ~num b:-> 4 ):10):16 013| end 038|println( ~msg 'fold left - sum: ' .. foldfirst2last( ~array a:[ -> 1, -> 2, -> 3 ] ~func sub sum(~a , ~b) ~initval 0 ):16 )... 040|println( ~msg 'filter - filter odd numbers: ' .. filtercopy( ~array a:[ -> 1, -> 2, -> 3 ] ~func sub even(~arg) )... 023| sub even(~arg) 025| return ((arg:-> 1 % 2):1 == 0):false 023| end 023| sub even(~arg) 025| return ((arg:-> 2 % 2):0 == 0):true 023| end 023| sub even(~arg) 025| return ((arg:-> 3 % 2):1 == 0):false 023| end 040|println( ~msg 'filter - filter odd numbers: ' .. filtercopy( ~array a:[ -> 1, -> 2, -> 3 ] ~func sub even(~arg) ):[ -> 2 ] )... 042|println( ~msg '*** map - square root of numbers ***' )... 044|... = mapcopy( ~array a:[ -> 1, -> 2, -> 3 ] ~func sub square(~arg) )... 028| sub square(~arg) 029| ... = recsum( ~num arg:-> 1 )... 005| if (num:-> 1 > 0):true 006| return (recsum( ~num (num:-> 1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:-> 1 - 1):0 ):0 + num:-> 1):1 006| end # if 029| arg = recsum( ~num arg:-> 1 ):1 030| return (arg:-> 1 * arg:-> 1):1 028| end 028| sub square(~arg) 029| ... = recsum( ~num arg:-> 2 )... 005| if (num:-> 2 > 0):true 006| return (recsum( ~num (num:-> 2 - 1):1 )... 005| if (num:1 > 0):true 006| return (recsum( ~num (num:1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:1 - 1):0 ):0 + num:1):1 006| end # if 006| return (recsum( ~num (num:-> 2 - 1):1 ):1 + num:-> 2):3 006| end # if 029| arg = recsum( ~num arg:-> 2 ):3 030| return (arg:-> 3 * arg:-> 3):9 028| end 028| sub square(~arg) 029| ... = recsum( ~num arg:-> 3 )... 005| if (num:-> 3 > 0):true 006| return (recsum( ~num (num:-> 3 - 1):2 )... 005| if (num:2 > 0):true 006| return (recsum( ~num (num:2 - 1):1 )... 005| if (num:1 > 0):true 006| return (recsum( ~num (num:1 - 1):0 )... 005| if (num:0 > 0):false 006| else 008| return 0 008| end # if 006| return (recsum( ~num (num:1 - 1):0 ):0 + num:1):1 006| end # if 006| return (recsum( ~num (num:2 - 1):1 ):1 + num:2):3 006| end # if 006| return (recsum( ~num (num:-> 3 - 1):2 ):3 + num:-> 3):6 006| end # if 029| arg = recsum( ~num arg:-> 3 ):6 030| return (arg:-> 6 * arg:-> 6):36 028| end 044|sqa = mapcopy( ~array a:[ -> 1, -> 2, -> 3 ] ~func sub square(~arg) ):[ -> 1, -> 9, -> 36 ] 046|for v = 1 047| println( ~msg v:1 )... 046|end 046|for ... 046|for v = 9 047| println( ~msg v:9 )... 046|end 046|for ... 046|for v = 36 047| println( ~msg v:36 )... 046|end 046|for ... 046|end # finish for loop 050|println( ~msg '*** mapreplace - add one to array ***' )... 053|mapreplace( ~array sqa:[ -> 1, -> 9, -> 36 ] ~func sub (~arg) )... 053| sub (~arg) 054| return (1 + arg:-> 1):2 053| end 053| sub (~arg) 054| return (1 + arg:-> 9):10 053| end 053| sub (~arg) 054| return (1 + arg:-> 36):37 053| end 057|for v = 2 058| println( ~msg v:2 )... 057|end 057|for ... 057|for v = 10 058| println( ~msg v:10 )... 057|end 057|for ... 057|for v = 37 058| println( ~msg v:37 )... 057|end 057|for ... 057|end # finish for loop