Task

Pass a function     as an argument     to another function.



Related task

   First-class functions


% Functions can be passed to other functions using the 'proctype'
% type generator. The same works for iterators, using 'itertype'
 
% Here are two functions
square = proc (n: int) returns (int) return (n*n) end square
cube = proc (n: int) returns (int) return (n*n*n) end cube
 
% Here is a function that takes another function
do_calcs = proc (from, to: int, title: string, 
                 fn: proctype (int) returns (int))
    po: stream := stream$primary_output()
 
    stream$putleft(po, title, 8)
    stream$puts(po, " -> ")
    for i: int in int$from_to(from,to) do
        stream$putright(po, int$unparse(fn(i)), 5)
    end
    stream$putc(po, '\n')
end do_calcs
 
start_up = proc ()
    do_calcs(1, 10, "Squares", square)
    do_calcs(1, 10, "Cubes", cube)
end start_up