Генератор
Проектов

Проект procfunc

Проект демонстрирует использование процедур и функций.

Функция задается ключевым словом func, идентификаторм, типом возвращаемого значения после доветочия, декларацией формальных параметров в скобках и программным блоком (в фигурных скобках). Значение функции определяется оператором return с выраженеим.

Процедура задается ключевым словом proc (или fproc), идентификаторм, декларацией формальных параметров в скобках и программным блоком (в фигурных скобках).

Тип функции может быть только простым. Формальные параметры задаются через запятую в виде типа и идентификатора параметра. Перед типом может быть ключевое слово in (по умолчанию), inout, out.

Считается, что функция всегда выдает значение. Процедура, заданная ключевым словом fproc, как и функция, тоже всегда корректно завершается. А вот процедура, заданная ключевым словом proc, может завершиться фатально. Источник фатального завершения процедуры - оператор error со списком параметров, формирующих текст сообщения об ошибке.

Если некоторая процедура выполняет оператор error, то выполнение ее операторов прекращается, производится выход в вызывающую процедуру с признаком фатальной ошибки. Вызывающая процедура тчоно так же прекращает выполнение с выходом в еще более выщестоящую процедуру и так далее. Это процесс завершается на самом верхнем уровне. Дальнейшее поведение зависит от типа пакета, в котором это произошло. В утилите происходит завершение ее работы с печатью в консоли текста ошибки.

Вызов функций производится в составе выражений. Вызов процедур - это отдельный оператор. Перед вызовом процедуры может стоять ключевое слово call (зачем это надо будет далее в других примерах). В вызове процедуры указывается идентификатор процедуры и в скобках список фактических параметров. Если вызываемая процедура описана с ключевым словом proc (не fproc), то такой вызов может завершиться ошибкой и выполнение операторов вызывающей процедуры прекратится, передача информации об ошибке по эстафете передается на уровень выше.

Процесс реакции на ошибку рапространяющийся по стеку вызовов процедур может быть в любом месте перехвачен. Для этого после закрывающей скобки списка фактических параметров нужно написать ключевое слово error и за ним указать текстовую переменную, в которую будет помещен текст сообщения об ошибке. Рекомендуется использовать в качестве типа переменной errfun.t_mess.

В теле процедуры, заданной ключевым словом fproc, нельзя использовать так называемые фатальные операторы, т.е. операторы, которые могут инициировать фатальную ошибку. К таким операторам отнсятся операторы error, вызовы процедур вида proc и ряд других.

Файл procfunc.gen:

project procfunc
  /version="01.001"
  /firm="УСТ"
  /http="http://www.ustech.ru"
  /email="managers@ustech.ru"

utility procfunc

Файл procfunc.utility:

utility procfunc:"PROC FUNC examples"

type t_char7 : char7[100];
type t_char8 : char8[100];
type t_chara : chara[100];
type t_char16 : char16[100];
type t_charw : charw[100];

func is_empty:bool(string8 s8)
{ return s8 = U"";
}

fproc check_empty(string8 s8,t_char8 c8)
{ if ( not is_empty(s8) )
    dprint("s8 is not empty\n");

  if ( not is_empty(c8) )
    dprint("c8 is not empty\n");
}

proc error_if_empty(string8 s8,t_char8 c8)
{ if ( is_empty(s8) )
    error "s8 is empty\n";

  if ( is_empty(c8) )
    error "c8 is empty\n";
}

main
{ var
    t_char7 c7 := "7-bit char litaral",
    t_char8 c8 := U"Алфавит - alphabet - αλφάβητο UTF-8",
    t_chara ca := A"Кириллица",
    t_char16 c16 := H"Алфавит - alphabet - αλφάβητο UTF-16",
    t_charw cw := W"Алфавит - alphabet - αλφάβητο UNICODE";

  dprint("c7: ",c7,"\n");
  dprint("c8: ",c8,"\n");
  dprint("ca: ",ca,"\n");
  dprint("c16: ",c16,"\n");
  dprint("cw: ",cw,"\n");
  if ( not is_empty(c8) )
    dprint("c8 is not empty\n");

  if ( not is_empty(c7) )
    dprint("c7 is not empty\n");

  call check_empty(c8,c8);
  check_empty(c8,c8);
  call error_if_empty(c8,c8);
  error_if_empty(c8,c8);

  { var
      errfun.t_mess err;

    error_if_empty(c8,c8) error err;
    if ( err <> "" )
      dprint("error_if_empty: ",err,"\n");
  }
}
Скачать проект procfunc