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.

Примеры

Пример 1

Каждый объект имеет паз "dom":

x::dom = domtype(x),
slot(45, "dom") = domtype(45),
sin::dom = domtype(sin)

Пример 2

Здесь мы получаем доступ к существующему "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:

Пример 3

Если вы используете 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:

Пример 4

Функциональная среда sin не содержит "sign" паз. Так доступ к этому пазу дает к FAIL:

slot(sin, "sign"), sin::sign

Пример 5

Мы задаем функциональную среду для функции, вычисляя логарифм к основному 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:

Пример 6

Здесь мы демонстрируем тонкое различие между 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:

Пример 7

Первый аргумент slot не сглажен. Это предоставляет доступ к пазам последовательностей выражения и null() объекты:

slot((a, b), "dom") = (a,b)::dom,
slot(null(), "dom") = (null())::dom

Пример 8

Мы даем пример для использования функционального 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.

Пример 9

Следующий пример скорее совершенствуется и технический. Это демонстрирует перегрузку 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):

Параметры

d

Область или функциональная среда

n

Имя паза: идентификатор

v

Новое значение паза: произвольный объект MuPAD

object

Произвольный объект 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 эквивалентны.

Смотрите также

Области MuPAD

Функции MuPAD