Блокноты 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.
При определении процедуры с proc, вы часто присваиваете процедуру идентификатору. Однако MuPAD позволяет вам использовать анонимные процедуры. Кроме того, можно задать одну процедуру в другой процедуре. Таким образом можно реализовать альтернативу статической переменной в MuPAD как вложенная процедура где:
Внешняя процедура имеет локальную переменную. Внешняя процедура может быть анонимной.
Внутренняя процедура использует локальную переменную внешней процедуры. Для внутренней процедуры, что переменная не локальна, и поэтому она не сбрасывает свое значение в каждом вызове.
Например, этот код реализует 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()
![]()
![]()
![]()
![]()