-- Code on page 480 from
-- Kenneth C. Louden, Programming Languages
-- Principles and Practice 2nd Edition
-- Copyright (C) Brooks-Cole/ITP, 2003
-- Attempt to define a compose higher-order
-- function in Ada (causes a compile-time error)

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;

procedure ComposeTry is

type IntProc is access function (x: in integer) return integer;

function compose (f, g: in IntProc) return IntProc
is

   function tempProc (x: in integer) return integer
   is
   begin
     return f(g(x));
   end tempProc;

begin
   return tempProc'access;
end compose;

function inc(x: integer) return integer is
begin
  return x + 1;
end inc;

f: IntProc;
begin
  f := compose(inc'access,inc'access);
  put(f(2));
end ComposeTry;
