type
    users_t = (tarasB := 0, superhackkiller1997, other_shit);
    say_ptr_t = procedure (const s : string);

var
    users : array of string = ('tarasB', 'superhackkiller1997', 'other_shit');

function bind(usr: users_t) : say_ptr_t;
begin
end;

{say_ptr_t bind(users_t usr) {
  void say(char * str) {
    fprintf(stderr, "%s: %s\n", users[usr], str);
  }
  say_ptr_t volatile p = say;
  return p;
}}

begin
    bind(tarasB)('is god');
    bind(superhackkiller1997)('shit');
    bind(other_shit)('ko-ko-ko');
end.