Переменные в процедурах

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Закрытия

Когда вы вызываете процедуру, MuPAD® выделяет память для локальных переменных, отмечает их как неинициализированные, и оценивает тело процедуры. В конце вызова процедуры MuPAD уничтожает локальные переменные, освобождая выделенную память. Теперь предположите, что результат вызова процедуры относится к локальным переменным той процедуры. Например, возвращенное значение этой процедуры отсылает к ее локальной переменной z:

f :=
proc(x, y)
  local z;
begin
  z := x + y;
  return(z);
end:

В этом случае переменная z заменяется ее значением в конце вызова процедуры. Поэтому возвращенное значение процедуры является значением переменной z, не самой переменной z:

f(1, 2)

Используйте hold, чтобы подавить оценку переменной z. Теперь процедура возвращает объект типа DOM_VAR:

f :=
proc(x, y)
  local z;
begin
  z := x + y;
  return(hold(z));
end:
f(1, 2)

Объекты типа DOM_VAR представляет локальные переменные и может только использоваться в процедурах. Объект типа, DOM_VAR, возвращенный в результате вызова процедуры, бесполезен, потому что это не имеет никакой связи с процедурой.

Можно получить доступ к локальным переменным процедуры, если вы или объявляете их в той процедуре или объявляете их в лексически заключающей процедуре. Например, в следующем коде процедура g может получить доступ и изменить переменную x процедуры включения f:

f :=
proc(x)
  local g;
begin
  g := proc()
  begin
    x := x+1;
  end:
  g();
end:
f(2)

Вместо того, чтобы возвратить результат вызова процедуры g(), можно возвратить сам g. В этом случае возвращенное значение сохраняет ссылку на переменную x вызова процедуры. По причинам управления памятью f должен объявить, что возвратит что-то содержащее ссылку на локальную переменную. Чтобы объявить его, используйте option escape:

f :=
proc(x)
  local g;
  option escape;
begin
  g := proc()
  begin
    x := x+1;
  end:
  g;
end:
h := f(2):
i := f(17):
h(); h(); i(); h()

Это построение программирования называется закрытием. Это поддерживается на многих языках программирования.

Статические переменные

Альтернатива статическим переменным в MuPAD

Много языков программирования поддерживают концепцию статических переменных. Статические переменные являются локальными переменными, значения которых не сбрасываются в каждом вызове процедуры. Значение статической переменной инициализируется во время первого вызова процедуры. В каждом последующем вызове процедура помнит значение статической переменной от предыдущего вызова.

Несмотря на то, что MuPAD не позволяет вам объявить переменную в процедуре как статическая переменная, можно все еще использовать концепцию статических переменных при программировании в MuPAD.

При определении процедуры с proc вы часто присваиваете процедуру идентификатору. Однако MuPAD позволяет вам использовать анонимные процедуры. Кроме того, можно задать одну процедуру в другой процедуре. Таким образом можно реализовать альтернативу статической переменной в MuPAD как вложенная процедура где:

  1. Внешняя процедура имеет локальную переменную. Внешняя процедура может быть анонимной.

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

Например, этот код реализует cnt как статическую переменную в MuPAD:

proc()
  local cnt;
  option escape;
begin
  cnt := 0;
  f :=
  proc()
  begin
    cnt := cnt + 1;
  end:
end():
f(); f(); f()

Разделяемые статические переменные

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

proc()
  local x, y;
  option escape;
begin
  x := 0; 
  y := 0;
  f := () -> (x := x + y; [x, y]);
  g := n -> (y := y + n; [x, y]);
end_proc():
f();
g(2);
f();
f()