Как указывает Велисарий, ваш вопрос в некоторой степени v5-центричный. Проблема, однако, все еще существует в текущих версиях. Как пример
Needs["Combinatorica`"]
ToCycles[{3, 4, 1, 2}]
работает нормально, пока (после перезапуска ядра),
Needs["Combinatorica`"]; ToCycles[{3, 4, 1, 2}]
завершается с ошибкой,
"ToCycles :: shdw: Symbol ToCycles
появляется в нескольких контекстах
{Combinatorica & # x60;, Global & # x60;}; определения
в контексте Combinatorica & # x60; может тень
или быть в тени других определений. "
В терминах Mathematica причина того, что однострочный не работает, состоит в том, что Mathematica пытается разрешить все символы в строке перед вычислением Needs
(это было для меня неожиданностью). Это разрешает ToCycles
в Global`ToCycles
(таким образом вводя этот символ в таблицу символов), прежде чем Needs
получит возможность загрузить определение Combinatorica`ToCycles
и добавить Combinatorica
к $ContextPath
. Чтобы заставить работать одну строку, вы должны использовать полное имя ToCyles
:
Needs["Combinatorica`"]; Combinatorica`ToCycles[{3, 4, 1, 2}]
Чтобы понять ошибку, вам нужно знать, что все символы в Mathematica имеют полное имя формы context`name
. Контекст похож на пространство имен во многих других языках. Теперь, если на символ (например, ToCycles
) ссылаются без контекста, Mathematica проверит контексты, в настоящее время находящиеся в $ContextPath
, и увидит, определен ли символ в каком-либо из этих контекстов. Если нет, символ разрешается в текущем контексте, $Context
, что при обычном использовании составляет Global
.
Когда вы загружаете пакет, символы этого пакета определяются в контексте пакета (например, Combinatorica
), а когда пакет полностью загружен, этот контекст добавляется в $ContextPath
, чтобы вы могли получить доступ к символам по их короткому имя.
Теперь вы можете увидеть, что означает ошибка: поскольку Combinatorica
еще не загружен, когда символы разрешены, ToCycles
разрешается до Global`ToCycles
. После загрузки пакета Mathematica тщательно проверяет, являются ли все короткие имена уникальными, и в этом случае обнаруживает, что короткое имя ToCycles
теперь определено в двух контекстах на $ContextPath
, один из которых «затеняет» другой. Чтобы сослаться на конкретный из этих символов, вы должны использовать полное имя, например, Combinatorica`ToCycles
.
Чтобы разрешить конфликт теней, просто Remove
нежелательный символ:
Remove[Global`ToCycles]
Не знаю, насколько это читабельно, но надеюсь, что это немного поможет ...