slot
Метод или запись области или функциональной среды
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.
d::n slot(d
,"n"
) d::n := v slot(d
,"n"
,v
) object::dom slot(object
, "dom")
d::n
возвращает значение паза под названием "n"
из объекта d
.
d::n := v
создает или изменяет паз "n"
. Значение v
присвоен пазу.
Функциональный slot
используется в определении методов и записей типов данных (области) или для определения атрибутов функциональных сред. Такие методы, записи или атрибуты называются пазами. Они позволяют перегружать системные функции определяемыми пользователем областями и функциональными средами. Смотрите раздел “Background” ниже для получения дополнительной информации.
Любой объект MuPAD® имеет специальный паз под названием "dom"
. Это содержит область, которой принадлежит объект: slot(object, "dom")
эквивалентно domtype(object)
. Значение этого специального паза не может быть изменено. См. Пример 1.
Кроме специального паза "dom"
, только области и функциональные среды могут иметь дальнейшие пазы.
Вызов slot(d, "n")
эквивалентно d::n
. Это возвращает значение паза.
Вызов slot(d, "n", v)
возвращает объект d
с добавленным или измененным пазом "n"
подшипник значения v
.
Для функции environmentd
, вызов slot(d, "n", v)
возвращает d
с измененным пазом "n"
и изменяет функциональную среду d
как побочный эффект. Это - так называемый “ссылочный эффект” функциональных сред. См. Пример 2.
Для domaind
, однако, вызов slot(d, "n", v)
изменяет d
как побочный эффект и возвращает область. Это - так называемый “ссылочный эффект” областей. См. Пример 3.
Если к несуществующему пазу получают доступ, FAIL
возвращен как значение паза. См. Пример 4.
::
- оператор является кратким обозначением, чтобы получить доступ к пазу.
Выражение d::n
, если не появляясь на левой стороне присвоения, эквивалентно slot(d, "n")
.
Команда d::n := v
присваивает значение v
к пазу "n"
из d
. Это присвоение почти эквивалентно изменению или созданию паза через slot(d, "n", v)
. Отметьте следующее тонкое семантическое различие между этими присвоениями: в d::n := v
, идентификатор d
оценен с уровнем 1, т.е. пазом "n"
присоединен к значению d
. В slot(d, "n", v)
, идентификатор d
полностью оценен. Смотрите Пример 6.
С delete d::n
или delete slot(d,"n")
, паз "n"
из функциональной среды или доменного d
удален. См. Пример 5. Специальный паз "dom"
не может быть удален.
Первый аргумент slot
не сглажен. Это позволяет получать доступ к пазам последовательностей выражения и null()
объекты. См. Пример 7.
Для областей существует специальный механизм, чтобы создать новую стоимость для пазов по требованию. Если не существующий паз читается, метод "make_slot"
из области называется для того, чтобы создать паз. Если такой метод не существует, FAIL
возвращен. См. Пример 8.
Каждый объект имеет паз "dom"
:
x::dom = domtype(x), slot(45, "dom") = domtype(45), sin::dom = domtype(sin)
Здесь мы получаем доступ к существующему "float"
паз функциональной среды sin
реализация синусоидальной функции. Паз плавающий является снова функциональной средой и может быть назван как любая функция MuPAD. Отметьте, однако, различную функциональность: в отличие от sin
, паз плавающий всегда пытается вычислить приближение с плавающей точкой:
s := sin::float: s(1), sin(1)
Со следующими командами, s
становится функциональной средой sin
кроме измененного "float"
паз. slot
вызов не оказывает влияния на исходный sin
функционируйте потому что slot
возвращает копию функциональной среды:
s := funcenv(sin): s::float := x -> float(x - x^3/3!): s(PI/3) = sin(PI/3), s::float(1) <> sin::float(1)
delete s:
Если вы используете slot
функционируйте, чтобы изменить записи паза в области, необходимо иметь в виду, что вы изменяете область:
old_one := Dom::Float::one
newDomFloat := slot(Dom::Float, "one", 1): newDomFloat::one, Dom::Float::one
Мы восстанавливаем исходное состояние:
slot(Dom::Float, "one", old_one): Dom::Float::one
delete old_one, newDomFloat:
Функциональная среда sin
не содержит "sign"
паз. Так доступ к этому пазу дает к FAIL
:
slot(sin, "sign"), sin::sign
Мы задаем функциональную среду для функции, вычисляя логарифм к основному 3
:
log3 := funcenv(x -> log(3, x)):
Если функциональный info
должен дать некоторую информацию о log3
, мы должны задать "info"
паз для этой функции:
log3::info := "log3 -- the logarithm to the base 3":
info(log3)
log3 -- the logarithm to the base 3
delete
оператор используется в удалении паза:
delete log3::info: info(log3)
log3(x) -- a library procedure [try ?log3 for help]
Не возможно удалить специальный паз "dom"
:
delete log3::dom
Error: Invalid argument. [delete]
delete log3:
Здесь мы демонстрируем тонкое различие между slot
функционируйте и использование ::
- оператор в присвоениях. Следующий вызов добавляет "xyz"
паз к доменному DOM_INT
из целых чисел:
delete b: d := b: b := DOM_INT: slot(d, "xyz", 42):
Паз "xyz"
из DOM_INT
изменяется, потому что d
полностью оценен с результатом DOM_INT
. Следовательно, паз DOM_INT::xyz
установлен в 42:
slot(d, "xyz"), slot(DOM_INT, "xyz")
Вот результат при использовании ::
оператор: d
только оценен с уровнем 1, т.е. он оценен к идентификатору b
. Однако нет никакого паза b::xyz
, и ошибка происходит:
delete b: d := b: b := DOM_INT: d::xyz := 42
Error: Unknown slot 'd::xyz'. [slot]
delete b, d:
Первый аргумент slot
не сглажен. Это предоставляет доступ к пазам последовательностей выражения и null()
объекты:
slot((a, b), "dom") = (a,b)::dom, slot(null(), "dom") = (null())::dom
Мы даем пример для использования функционального make_slot
. Элемент undefined
из доменного stdlib::Undefined
представляет неопределенное значение. Любой функциональный f
должен дать к f(undefined) = undefined
. В реализации stdlib::Undefined
, мы находим:
undef := newDomain("stdlib::Undefined"): undefined := new(undef): undef::func_call := proc() begin undefined end_proc; undef::make_slot := undef::func_call:
Следующий механизм происходит автоматически для функционального f
это сверхзагружаемо его первым аргументом: в вызове f(undefined)
, это проверяется ли паз undef::f
\exists. Если дело обстоит не так, make_slot
функция создает этот паз “на лету”, производя значение undefined
. Таким образом, через перегрузку, f(undefined)
возвращает значение undefined
.
Следующий пример скорее совершенствуется и технический. Это демонстрирует перегрузку slot
функционируйте, чтобы реализовать доступ к пазу и назначения слотов для других объектов, чем области (DOM_DOMAIN
) или функциональные среды (DOM_FUNC_ENV
). Следующий пример задает пазы "numer"
и "denom"
для рациональных чисел. Доменный DOM_RAT
из таких чисел не имеет пазов "numer"
и "denom"
:
domtype(3/4)
slot(3/4, "numer")
Error: Unknown slot '(3/4)::numer'. [slot]
Мы можем изменить DOM_RAT
,как бы то ни было. Для этого мы имеем к оставить без защитыDOM_RAT
временно:
unprotect(DOM_RAT): DOM_RAT::slot := proc(r : DOM_RAT, n : DOM_STRING, v=null(): DOM_INT) local i : DOM_INT; begin i := contains(["numer", "denom"], n); if i = 0 then error("Unknown slot \"".expr2text(r)."::".n."\"") end; if args(0) = 3 then subsop(r, i = v) else op(r, i) end end_proc:
Теперь мы можем получить доступ к операндам рациональных чисел, которые являются числителем и знаменателем соответственно через наши новые пазы:
slot(3/4, "numer"), (3/4)::numer, slot(3/4, "denom"), (3/4)::denom
a := 3/4: slot(a, "numer", 7)
a::numer := 11: a
Мы восстанавливаем исходное поведение:
delete DOM_RAT::slot, a: protect(DOM_RAT, Error):
| |
|
Имя паза: идентификатор |
|
Новое значение паза: произвольный объект MuPAD |
|
Произвольный объект MuPAD |
slot(d, "n")
возвращает значение паза; slot(d, "n", v)
возвращает объект d
с добавленным или измененным пазом; slot(object, "dom")
возвращает доменный тип объекта.
d
Перегрузка системных функций доменными элементами обычно реализуется можно следующим образом. Если библиотечная функция f
, Скажем, должно быть сверхзагружаемым пользовательскими типами данных, сегмент кода, как обозначено следующими линиями является соответствующим. Это тестирует ли доменный x::dom
из аргумента x
содержит метод f
. Если это верно, этот доменный метод называется:
f:= proc(x) begin // check if f is overloaded by x if x::dom::f <> FAIL then // use the method of the domain of x return(x::dom::f(args())) else // execute the code for the function f endif end_proc:
Путем перегрузки функционального slot
, доступ к пазу и назначение слотов могут быть реализованы для других объектов, чем области или функциональные среды. См. Пример 9.
В принципе, имя n
из паза может быть произвольный объект MuPAD. Обратите внимание, однако, что ::
- оператор не может получить доступ к пазам, заданным slot(d, n, v)
если имя n
не строка.
Строки могут использоваться в сочетании с ::
оператор: вызовы d::"n"
и d::n
эквивалентны.