Блокноты 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()