Средства создания пакетов расширений
Средства создания пакетов расширений
Для создания пакетов расширений в общем случае используются следующие средства системы:
- 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.
Следует отметить, что широкое применение комментариев обычно является признаком культуры программирования. Это особенно важно для математических систем, реализующих вычисления по сложным и подчас малопонятным для неспециалистов алгоритмам. Без подробных комментариев пакеты расширений и применений теряют свою практическую полезность и превращаются в ребусы — увы, куда менее интересные, чем те, которые публикуются в газетах и журналах.