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

Блокноты 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):