1. with Ada.Calendar;      use Ada.Calendar; 
  2. with Ada.Float_Text_IO; use Ada.Float_Text_IO; 
  3. with Ada.Text_IO;       use Ada.Text_IO; 
  4.  
  5. procedure Task_Scopes is 
  6.  
  7.    Start_Up_Time : constant Time := Clock; 
  8.  
  9.    procedure Put_Line_Time (S : String) is 
  10.  
  11.    begin 
  12.       -- Prefixes the time since startup as seconds with two decimal places 
  13.       Put (Float (Clock - Start_Up_Time), 1, 2, 0); Put_Line (" seconds: " & S); 
  14.    end Put_Line_Time; 
  15.  
  16.    task type Outer_Type; 
  17.    type Outer_Type_Ptr is access Outer_Type; 
  18.    task body Outer_Type is 
  19.  
  20.    begin 
  21.       delay 0.6; Put_Line_Time ("-- End of an outer task"); 
  22.    end Outer_Type; 
  23.  
  24.    task Static_Outer_Task; 
  25.    task body Static_Outer_Task is 
  26.  
  27.    begin 
  28.       delay 0.1; Put_Line_Time ("Start of Static_Outer_Task"); 
  29.       declare 
  30.  
  31.          task type Inner_Type; 
  32.          type Inner_Type_Ptr is access Inner_Type; 
  33.          task body Inner_Type is 
  34.  
  35.          begin 
  36.             delay 0.6; Put_Line_Time ("-- End of an inner task"); 
  37.          end Inner_Type; 
  38.  
  39.          task Static_Inner_Task; 
  40.          task body Static_Inner_Task is 
  41.  
  42.          begin 
  43.             delay 0.2; Put_Line_Time ("Start of Static_Inner_Task"); 
  44.             declare 
  45.                Inner_Task_Instance : Inner_Type; 
  46. --                 Outer_Task_Instance : Outer_Type; 
  47. --                 Dynamic_Inner_Instance : Inner_Type_Ptr := new Inner_Type; 
  48. --                 Dynamic_Outer_Instance : Outer_Type_Ptr := new Outer_Type; 
  49.             begin 
  50.                delay 0.3; Put_Line_Time ("End of Static_Inner_Task declare block"); 
  51.             end; 
  52.             delay 0.1; Put_Line_Time ("End of Static_Inner_Task"); 
  53.          end Static_Inner_Task; 
  54.  
  55.       begin 
  56.          delay 0.4; Put_Line_Time ("End of Static_Outer_Task declare block"); 
  57.       end; 
  58.       delay 0.1; Put_Line_Time ("End of Static_Outer_Task"); 
  59.    end Static_Outer_Task; 
  60.  
  61. begin 
  62.    delay 0.2; Put_Line_Time ("Start of main scope"); 
  63.    delay 0.2; Put_Line_Time ("End of main scope"); 
  64. end Task_Scopes;