Детализация
Символы и контексты (Contexts)
Полное имя каждого объекта состоит из двух частей: контекста ( context ) и короткого имени ( short name ). Полное имя объекта пишется в следующем виде: context'short name. Обратная кавычка ' называется меткой контекста ( context mark ).
In[61] : = abc'x abc'x =10 abc'х2 Out[6l]=abc'x Out[62]=10 Out[63]=100
Символы с одинаковым именем, но разными контекстами - различны:
In[64]: = х == х а'х==b'х а'х==а'у Out[64] =True Out[65] =а'х==b'х Out[66] =а'х==а'у
В каждый момент времени фиксирован так называемый текущий контекст, имя которого находится в переменной $Context:
In[67]:=$Context Out[67]=Global'
Объекты текущего контекста можно называть их короткими именами:
In[68]:=х==Global'х Out[68]=True
Контексты аналогичны директориям (папкам) с файлами:
- текущий контекст - текущая папка, к файлам которой можно обращаться по их именам, не указывая полный путь;
- подобно тому как папки могут содержать другие папки, контексты могут быть сложными:
In[69]:=a'b'x==а'с'х Out[69]=а'b'х==а'с'х
Отметим, что в момент запуска Mathematica устанавливается контекст Global'. Пользовательские символы относятся именно к этому контексту. Однако, скажем, Pi имеет контекст System'. Чтобы в этом убедиться, примените к Pi команду Context[]:
In[70]:= Context [x] Context[Pi] Out[70] = Global' Out[71] = System'
В Mathematica реализована возможность пользоваться краткими именами объектов, относящихся к разным основным контекстам. Все такие контексты перечислены в списке $ContextPath. Полный список имеющихся контекстов можно получить, выполнив команду Contexts[]:
In[72]:=$ContextPath // InputForm Out[72] = {"PacletManager'", "WebServices'" , "System'", "Global'"}
Если в $ContextPath встречаются два контекста, содержащих один и тот же символ, скажем x, то при обращении к x он интерпретируется в соответствии с тем контекстом, который встречается первым в списке $ContextPath (все остальные одноименные символы "затеняются"):
In[73]:=$ContextPath={"а'","b'"}≈Join≈ $ContextPath {а"х, b"х} Context[x] Out[73]= {a", b', PacletManager', WebServices', System', Global'} Out[74]={x,b'x] Out[75]=a'
Таким образом, здесь x воспринимается как . Если такой x больше не нужен, можно выполнить команду , и символ a'x будет уничтожен. Теперь x будет восприниматься как :
In [76]:=Remove [x] Context[x] Out[77]=b' In[78]:=Remove [x] Context[x] Out[79]=Global' In[80]:=$ContextPath=Drop[$ContextPath,2] Out[80]={PacletManager',WebServices',System',Global'}
Пакеты (Packages)
Пакеты - расширения Mathematica, написанные на языке Mathematica и содержащие определения, которые "учат" Mathematica работать в соответствующих областях. Загрузить такой пакет можно командой <<package или Needs[package], где package имеет такой же формат, как context:
In[81]:=<< VectorAnalysis'
Одной из функций, реализованных в этом пакете, является вычисление дивергенции (в заданной координатной системе) или в координатной системе coorsystem с помощью команды :
In[82] :=SetCoordinates [Cartesian [x, y, z] ] (* задает текущую систему координат*) Div[{x2,y2, z2}] Out[82] = Cartesian [x, y, z] Out[83] =2x+2y+2 z In[84] :=SetCoordinates [Spherical [r, θ, ϕ] ] Div[{r2, θ2, ϕ2}] Out[84] = Spherical [r, θ, ϕ]
In[86]: = CoordinateSystem (*выдает название текущей системы координат *) Div [{r2, ϕ2, z2},Cylindrical [r,ϕ, z] ] Out[86] = Spherical
Текущий список загруженных пакетов присвоен переменной $Packages:
In[88]:=$Packages Out[88] = {VectorAnalysis ', JLink', PacletManager', WebServices', System', Global'}
Типичная ошибка при использовании пакета - попытка выполнить до его загрузки некоторую функцию f, короткое имя которой имеется у одной из функций пакета. Если такое произошло, то выполняемой функции автоматически присваивается контекст Global'. После загрузки пакета одноименная функция из этого пакета начинает затенять функцию Global 'f, о чем сообщается в диагностике. Если вам не нужна функция из пакета, а нужна определенная вами, выполните команду Remove[f] (см. выше).
Отличие << (или Get ) от Needs: команда Needs загружает пакет только если он еще не был загружен, что определяется по тому, есть ли его имя в списке $Packages или нет.