Работа с контекстами
Работа с контекстами
В системе Mathematica есть средства для визуализации контекстов. Прежде всего это функция Context: Context[Tan] System' Context[E] System' Context/@Cos,Pi,Abort {System', System' , System'} Текущее значение контекста определяет системная переменная $Context или функция Context [ ]:
{$Context,Context[]} {Global', Global'} В начале сеанса работы по умолчанию действует контекст Global ~, что означает глобальный статус вводимых символов: Context/@{q,r,w} {Global', Global', Global'} Однако контекст может быть заменен на любой нужный пользователю просто указанием его перед соответствующим символом или словом: {new'q, new' w,Global'r} {new'q, new'w, r} Context/@{new' q,new' w,Global' r} {new', new', Global4} Обратите внимание на то, что символы new 4 q и new' w имеют новый контекст new s и отображаются вместе с ним (но контекст указан перед символом). А вот символ Global ~ r отображается лишь своим кратким именем. Причина этого в том, что текущий контекст есть Global 4 , а контекст new 4 отсутствует в списке контекстов (context path). Что касается символов q, r и z, то сами по себе (без новой контекстной приставки) они по-прежнему имеют контекст "Global: Context/@{q,r,w} {Global 4 , Global 4 , Global 4 } Для вывода списка контекстов используется переменная $ContextPath: $ContextPath {Graphics 4 Animation 4 , Global 4 , System 4 } С помощью функции Prepend можно добавить в список новый контекст, например new": $ContextPath=Prepend[$ContextPath,"new4"] {new', Graphics' Animation', Global', System'} Теперь функция Context возвращает только контексты символов new'q, new'w и Global' r: Context/@{new'q,new'w,Global'r} {new', new', Global'} С помощью функции Begin можно изменить текущий контекст на заданный, например Global' на new': Begin["new''"] new'q=5; {q,Context[q]} {5, new'} Теперь легко разобраться, как интерпретируются символы с разными контекстами. Любой символ, вводимый без контекстной приставки, то есть своим коротким именем, интерпретируется и выводится с этим именем, если его контекст является текущим. Если символ вводится полным именем, то проверяется, есть ли его контекст в списке $ContextPath. Если он есть, то к символу добавляется самый левый контекст из имеющихся в списке. Таким образом, по мере ввода новых контекстов, имена которых совпадают со старыми, происходит вытеснение новыми контекстами старых. Другими словами, это позволяет обновить уже имеющиеся определения, сохранив их на случай отмены старых контекстов. Этот принципиально важный механизм модификации объектов играет решающую роль в создании пакетов расширений. В них часто уже имеющиеся функции (со старыми контекстами) заменяются новыми, одноименными с ними, но имеющими иные контексты.