Записи с меткой «return»

Защита идентификаторов от модификации

Защита идентификаторов от модификации
Атрибут защиты Protected
Как уже отмечалось, система Mathematica позволяет вводить константы, переменные и функции со своими именами — идентификаторами. Между функциями можно задавать различные отношения, в том числе и те, которые не соответствуют правилам, заданным в ядре системы.
Идентификаторы должны быть уникальными, то есть не совпадать с именами встроенных функций, директив, опций, переменных и констант. Однако как быть, если нужно задать новое отношение для уже имеющихся встроенных функций или изменить их определения?
Для решения таких вопросов в систему введена защита идентификаторов от модификации, которая при необходимости может сниматься. Все встроенные в ядро именованные объекты языка программирования системы являются защищенными по умолчанию. Они имеют соответствующий признак — атрибут Protected (защищенный).
Установка и снятие атрибута защиты
Для управления средствами защиты от модификации используются следующие директивы:

  • Protect [s1, s2,…] — устанавливает атрибут защиты от модификации (Protected) для перечисленных символов si;
  • Protect [\"forml\", \"form2\",…] — устанавливает атрибут защиты от модификации для всех символов, имена которых сопоставимы с любым из указанных строковых шаблонов f ormi;
  • Unprotect [s1, s2,…] — удаляет атрибут защиты от модификации (Protected) для символов si, что делает возможной их модификацию;
  • Unprotect [\"forml\", \"form2\",…] — снимает защиту всех символов, имена которых текстуально (по буквам) сопоставимы с любым из указанных formi.

Дополнительные функции защиты
Следующие атрибуты и директивы также используются при управлении модификацией:

  • NProtectedAll — атрибут, устанавливающий, что ни один из аргументов функции не будет модифицирован при применении N [ ];
  • NProtectedFirst — атрибут, указывающий, что первый аргумент функции не будет модифицирован применением N [ ];
  • NProtectedRest — атрибут, устанавливающий, что все аргументы после первого аргумента функции не будут модифицированы применением N [ ].

Мы уже рассматривали модификацию функций, в частности снятие и назначение атрибутов защиты. Отметим лишь, что из последующих примеров будет ясно, что эти операции широко применяются в пакетах расширений.
Примеры подготовки пакетов расширений
Наиболее сложным моментом работы с системой Mathematica является разработка пакетов расширения профессионального качества. далее…

Средства создания пакетов расширений

Средства создания пакетов расширений
Для создания пакетов расширений в общем случае используются следующие средства системы:

  • Begin ["context’"] — устанавливает текущий контекст;
  • BeginPackage ["context’"] — делает context единственным активным контекстом. Возможна также форма BeginPackage [ "context" ", { "needl’ ", "need2’",…}];’
  • Return [ ] — возвращает Null;
  • End [ ] — возвращает текущий контекст и переходит к предыдущему;
  • EndAdd [ ] — возвращает текущий контекст и переходит к предыдущему, предварительно добавляя текущий контекст к списку контекстов $Context-Path;
  • EndPackage [ ] — восстанавливает $Context и $ContextPath в их значениях до предшествующего BeginPackage и добавляет текущий контекст к списку $ContextPath;
  • Exit [ ] — завершает сеанс работы Mathematica;
  • Goto [tag] —просматривает текущее составное выражение в поиске Label [tag] и передает управление в эту точку;
  • Interrupt [ ] — производит прерывание в теле вычислений;
  • Label [tag] — представляет точку в составном выражении, в которую управление передается директивой Goto;
  • Quit [ ] — завершает сеанс работы Mathematica.

Приведем пример простого фрагмента программы, дающего определение новой функции ExpandBoth с помощью некоторых из представленных средств:
(* :Title: ExpandBoth *)
(* :Context: ProgramminglnMathematica’ExpandBoth" *)
(* : Author: Roman E. Maeder *)
ExpandBoth: : usage = "ExpandBoth [e] expands all numerators and denominators in e."
Begin ["’ Private1"]
ExpandBoth [x_Plus] := ExpandBoth /@ x
ExpandBoth [x_] := Expand [ Numerator [x] ] / Expand [ Denominator [x] ]
End [ ] Null
Этот пример настолько прост, что читателю будет нетрудно разобраться с его сутью — расширением выражения по числителю и знаменателю. Ниже представлен сеанс работы с этим пакетом, файл которого expboth.m размещен в каталоге mypack, включенном в общий каталог пакетов расширений:
<<mypack\expboth.m
?ExpandBoth
ExpandBoth [e] expands all numerators and denominators in e.
ExpandBoth [124 /12]
31/3
ExpandBoth [1234/12]
617/6
Мы вернемся к рассмотрению построения пакетов расширений после более детального рассмотрения некоторых деталей этого процесса.
Текстовые сообщения и комментарии
Ценность многих программ на любом языке программирования нередко сводится к нулю из-за отсутствия подробных текстовых комментариев. Из-за этого даже сами разработчики программ через месяц-другой перестают понимать собственные творения. А что говорить о пользователях, рискующих применить такие программы?
Для создания текстовых комментариев различного назначения (как выводимых, так и не выводимых на экран в ходе работы с пакетом) в языке программирования системы Mathematica используются следующие средства:

  • (* Comment *) — задание не выводимого на экран текстового комментария, как однострочного, так и многострочного, в любом месте пакета;
  • Message [symbol: : tag] — вывод сообщения symbol::tag, если только вывод сообщений не отключен;
  • Message [symbol: :tag, e1, e2,…] — выводит сообщение, вставляя значения ei по мере необходимости;
  • $MessageList — глобальная переменная, возвращающая список имен сообщений, вырабатываемых во время вычисления текущей входной строки. Имя каждого сообщения заключено в HoldForm [ ]. $MessageList сохраняется в MessageList [n] и переустанавливается в { } после того, как произведена п-я выходная строка;
  • MessageList [n] — глобальный объект, который является списком имен (сообщений), которые вырабатываются в процессе обработки п-й входной строки;
  • MessageName, применяется в виде symbol: : tag или MessageName [symbol, "tag" ] — имя для сообщения;
  • $MessagePrePrint — глобальная переменная, чье значение, если установлено, применяется к выражениям перед тем, как они помещаются в текст сообщений;
  • $Messages — возвращает список файлов и каналов, в которые направляется вывод сообщений;
  • Messages [symbol] — возвращает все сообщения, присвоенные данному символу symbol.

Следует отметить, что широкое применение комментариев обычно является признаком культуры программирования. Это особенно важно для математических систем, реализующих вычисления по сложным и подчас малопонятным для неспециалистов алгоритмам. Без подробных комментариев пакеты расширений и применений теряют свою практическую полезность и превращаются в ребусы — увы, куда менее интересные, чем те, которые публикуются в газетах и журналах.