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)
. Значение этого специального слота не может быть изменено. Cf. Пример 1.
Кроме специального слота "dom"
, только области и функциональные среды могут иметь дальнейшие слоты.
Вызов slot(d, "n")
эквивалентен d::n
. Это возвращает значение слота.
Вызов slot(d, "n", v)
возвращает объект d
с добавленным или измененным слотом "n"
, переносящим значение v
.
Для функции environmentd
, вызов slot(d, "n", v)
возвращает d
с измененным слотом "n"
и изменяет функциональную среду d
как побочный эффект. Это - так называемый “ссылочный эффект” функциональных сред. Cf. Пример 2.
Для domaind
, однако, вызов slot(d, "n", v)
изменяет d
как побочный эффект и возвращает область. Это - так называемый “ссылочный эффект” областей. Cf. Пример 3.
Если к несуществующему слоту получают доступ, FAIL
возвращен как значение слота. Cf. Пример 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
. Cf. Пример 5. Специальный слот "dom"
не может быть удален.
Первый аргумент slot
не сглажен. Это позволяет получать доступ к слотам последовательностей выражения и объектов null()
. Cf. Пример 7.
Для областей существует специальный механизм, чтобы создать новую стоимость для слотов по требованию. Если не существующий слот читается, метод, "make_slot"
области называется в порядке создать слот. Если такой метод не существует, FAIL
возвращен. Cf. Пример 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
. Если дело обстоит не так, функция 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
доступ к слоту и назначение слотов могут быть реализованы для других объектов, чем области или функциональные среды. Cf. Пример 9.
В принципе имя n
слота может быть произвольным объектом MuPAD. Обратите внимание, однако, что ::
- оператор не может получить доступ к слотам, заданным slot(d, n, v)
, если имя n
не является строкой.
Строки могут использоваться в сочетании с ::
- оператор: вызовы d::"n"
и d::n
эквивалентны.