(495)240-8280ПН-СБ с 12:00 до 20:00
We speak English

3.2. Вызов программы внутри программы

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

// описания программы
THIRDANG();
ANG();

// THIRDANG(a, b)
// Берет два угла a и b треугольника (в радианах) и
// выдает третий угол (в градусах)
EXPORT THIRDANG(a, b)
BEGIN
  LOCAL angle1, angle2;
  angle1 := ANG(a);
  angle2 := ANG(b);
  RETURN(180-angle1-angle2);
END;

// ANG(a)
// Берет угол a (в радианах) и выдает тот же самый угол в градусах
EXPORT ANG(a)
BEGIN
  a := a/PI*180;
  RETURN(a);
END;

Давайте подробнее рассмотрим исходный код, прописанный выше:

  1. Внутри одного исходного файла с именем PROJECT мы создали две программы: THIRDANG и ANG. Они становятся новыми "командами", которые мы можем использовать в командной строке в Главном представлении (Home view).
  2. Вверху файла находятся описания программы. Они нужны только на тот случай, если мы планируем использовать программы, перечисленные как подпрограммы. В данном примере ANG() вызывается как подпрограмма из THIRDANG() и, таким образом, должна быть описана "перед" (то есть сверху, выражаясь на языке программирования) исходным кодом программы THIRDANG(). Также сверху мы добавили и описание самой программы THIRDANG(). Однако так как она не вызывается ни одной другой программой, ее описание необязательно. (Мы включили ее описание, потому что THIRDANG() нам может понадобиться в качестве подпрограммы позже, а также потому что так удобней отслеживать все программы, созданные внутри данного исходного файла). В целом, подпрограммы нужно описывать до того, как они вызываются внутри программы. При желании мы могли бы поместить исходный код ANG() над исходным кодом THIRDANG(), чтобы избежать необходимости описания любых подпрограмм (так как определение программы эквивалентно ее описанию с целью использования). Однако это не очень хороший способ программирования, потому что будут случаи, когда две программы могут вызывать выполнение программы туда и обратно, и, таким образом, выражение описания должно быть сделано как минимум для одной из них. Лично я предлагаю помещать все такие описания вверху исходного фала, чтобы не приходилось иметь дело с упорядочиванием существующего исходного кода для каждой программы.
  3. Описание подпрограмм требует постановки скобок после имени программы. Если скобки не поставить, то имена будут интерпретированы как глобальные переменные! (Мы об этом поговорим чуть позже). Однако аргументы этих программ исключаются. То есть мы описали ANG() как подпрограмму, но не указываем ее аргументы, пока фактически не определим программу в исходном коде.
  4. Значение, выданное ANG(), можно сохранить в программе, вызывающей его. Например, angle1 := ANG(angle1);.
  5. Для большинства типов переменных автореферентность не проблема. То есть в таком выражении как angle1 := angle1-1; правая сторона вычисляется первой до замены значения, сохраненного в angle1, новым значением.
  6. В программе THIRDANG() написано выражение выдачи, потому что оно позволяет избежать необходимости использования другой внутренней переменной.
  7. При выборе пункта из Каталога программ (Program Catalog)пользователям предоставляется выбор - запустить либо THIRDANG, либо ANG.

Чтобы использовать программу THIRDANG, просто введите THIRDANG(PI/3, PI/2);, и результат будет 30.