Протестируйте аргументы

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.

Проверяйте типы аргументов

При записи процедуры MuPAD® можно задать тип аргументов, принятых процедурой. Чтобы задать процедуру, которая принимает только конкретные типы аргументов, задайте ожидаемые типы при определении формальных параметров процедуры. Например, формальный параметр следующей процедуры принимает только те аргументы, которые принадлежат доменному DOM_INT:

f:= proc(k:DOM_INT)
begin
  sin(PI*k/4)
end_proc:

Поэтому только целое число является допустимым первым аргументом для этой процедуры:

f(1)

Система сравнивает тип формального параметра k и тип аргумента передал процедуре. Если первый аргумент, что вы передаете процедуре f не целое число, MuPAD выдает ошибку:

f(2/3)
Error: Invalid object '2/3'. Type of argument number 1 must be 'DOM_INT'.
  Evaluating: f

Во время типичного вызова процедуры, например, вызов solve или int функция, MuPAD внутренне вызывает много других процедур. Тестирование типов аргумента для каждого вызова внутренней процедуры является в вычислительном отношении дорогим. Чтобы обеспечить лучшую производительность, MuPAD уменьшает сумму типа, регистрируется в под управлением коде. По умолчанию система проверяет типы аргументов только в тех процедурах, которые вы вызываете в интерактивном режиме. Если одна процедура внутренне вызывает другую процедуру, MuPAD не проверяет типы аргументов внутренне названной процедуры. Например, создайте следующую процедуру g как обертка для процедуры f:

g := proc(n:Type::Numeric) begin f(n) end_proc:

MuPAD выполняет проверки типа только для аргументов процедуры g, который вы вызываете в интерактивном режиме. Это не выполняет проверки типа для аргументов процедуры f:

g(2/3)

Pref::typeCheck функция позволяет вам управлять проверкой типа аргументов процедуры. Эта функция влияет на все процедуры. Это не позволяет вам управлять проверкой типа отдельные процедуры. Настройка по умолчанию Pref::typeCheck Interactive:

Pref::typeCheck()

Чтобы выполнить регистрации типа всех вызовов процедуры, включая внутренние вызовы, устанавливают значение Pref::typeCheck к Always:

Pref::typeCheck(Always):

Теперь система понимает, что 2/3 не является допустимым аргументом внутренне названной процедуры f:

g(2/3)
Error: Invalid object '2/3'. Type of argument number 1 must be 'DOM_INT'.
  Evaluating: f

Чтобы отключить регистрации типа всех вызовов процедуры, включая интерактивные вызовы, устанавливают значение Pref::typeCheck к None:

Pref::typeCheck(None):

Теперь система не проверяет типы аргумента ни в какие вызовы процедуры:

g(2/3), f(2/3)

Восстановить настройку по умолчанию Pref::typeCheck, используйте NIL опция:

Pref::typeCheck(NIL):

Проверяйте аргументы отдельных процедур

При записи процедуры в MuPAD можно включать собственные тесты для аргументов процедуры в самой процедуре. Можно протестировать типы, значения или любые другие свойства аргументов процедуры. Например, создайте процедуру, которая вычисляет arcsine функцию вещественного числа. Предположим, вы хотите ограничить возможные результаты этой процедуры к вещественным числам. В этом случае входной параметр процедуры должен принадлежать интервалу [-1,1]. Чтобы гарантировать, что процедура принимает только значения от этого интервала, протестируйте значение входного параметра в процедуре:

p := proc(x:Dom::Real)
begin
  if abs(x) > 1 then
    error("invalid number. Choose a value from the interval [-1,1].");
  end_if;
  arcsin(x)
end_proc:

Как правило, когда вы вызываете одну процедуру MuPAD, та процедура внутренне вызывает другие процедуры MuPAD. Некоторые из этих внутренних вызовов являются множественными вызовами той же процедуры с различными наборами аргументов. Тестирование аргументов для каждого вызова внутренней процедуры может стать в вычислительном отношении дорогим. По умолчанию система использует следующий общий принцип в тестировании аргументов типичной процедуры MuPAD:

  • Если вы вызываете процедуру в интерактивном режиме, процедура выполняет все проверки аргумента.

  • Если одна процедура внутренне вызывает другую процедуру, вторая процедура пропускает проверки аргумента.

В настоящее время, процедура p всегда проверки, принадлежит ли значение его аргумента интервалу [-1,1]. Чтобы следовать за общим принципом для тестирования аргументов, процедура должна смочь распознать внутренние и интерактивные вызовы и проверку аргументов пропуска, когда вызов является внутренним. Для этой задачи MuPAD обеспечивает testargs функция. Когда вы вызываете testargs в интерактивном вызове процедуры, testargs возвращает значение TRUE. Для вызовов внутренней процедуры, testargs возвращает значение FALSE по умолчанию. Например, перепишите свою процедуру p можно следующим образом:

p := proc(x)
begin
  if testargs() then
    if abs(x) > 1 then
      error("invalid number. Choose a value from the interval [-1,1].");
    end_if;
  end_if;
  arcsin(x)
end_proc:

Когда вы вызываете процедуру p, это проверяет, принадлежит ли входной параметр заданному интервалу:

p(1/2), p(1), p(0)

p(10)
Error: invalid number. Choose a value from the interval [-1,1]. [p]

Теперь запишите простой процедуре обертки f это вызывает процедуру p:

f := proc(x) begin p(x) end_proc:

Когда процедура обертки f вызовы p, процедура p не проверяет его аргументы потому что testargs возвращает значение FALSE:

f(10)

testargs функция также позволяет вам переключаться на режим проверки аргументов. В этом режиме MuPAD проверяет аргументы всех процедур, независимо от того, как процедура называется. Этот режим может замедлить ваши расчеты. Используйте этот режим только в отладке вашего кода. Чтобы переключиться на режим проверки аргументов, установите значение testargs к TRUE:

testargs(TRUE):

В режиме проверки аргументов, процедура p проверяет его аргумент во время интерактивных и внутренних вызовов:

p(10)
Error: invalid number. Choose a value from the interval [-1,1]. [p]
f(10)
Error: invalid number. Choose a value from the interval [-1,1]. [p]

Всегда восстанавливайте testargs к его значению по умолчанию FALSE после того, как вы закончили отлаживать:

testargs(FALSE):