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.

Примеры

Пример 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. Если дело обстоит не так, функция 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 доступ к слоту и назначение слотов могут быть реализованы для других объектов, чем области или функциональные среды. Cf. Пример 9.

В принципе имя n слота может быть произвольным объектом MuPAD. Обратите внимание, однако, что :: - оператор не может получить доступ к слотам, заданным slot(d, n, v), если имя n не является строкой.

Строки могут использоваться в сочетании с :: - оператор: вызовы d::"n" и d::n эквивалентны.

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

Области MuPAD

Функции MuPAD