type
    users_t = (tarasB, superhackkiller1997, other_shit);
    say_ptr_t = procedure(str: PChar);
const
    users: array[users_t] of PChar = ('tarasB', 'superhackkiller1997', 'other_shit');

    procedure say(str: PChar; usr: users_t);
        begin
        Writeln(ErrOutput, users[usr] + ': ' + str)
        end;
    procedure say_tarasB(str: PChar);
        begin
            say(str, tarasB)
        end;
    procedure say_superhackkiller1997(str: PChar);
        begin
            say(str, superhackkiller1997)
        end;
    procedure say_other_shit(str: PChar);
        begin
            say(str, other_shit)
        end;

function bind(usr: users_t): say_ptr_t;
    begin
        case usr of
        tarasB: 
            bind := @say_tarasB;
        superhackkiller1997: 
            bind := @say_superhackkiller1997;
        other_shit: 
            bind := @say_other_shit;
        else
            bind := @say_other_shit;
        end;
    end;

var
  p: say_ptr_t; 
begin
  p := bind(tarasB);
  p('shit');
  p := bind(superhackkiller1997);
  p('i''m god');
  p := bind(other_shit);
  p('ko-ko-ko');
  halt(0)
end.