проблема импорта пакетов в Mathematica - PullRequest
5 голосов
/ 12 января 2011

В Mathematica (я использую mma 5.0 (думаю, довольно старая)), если я наберу следующую строку одной строкой:

Needs["Graphics`Master`"]; Animate[Plot[Sin[n x], {x, 0, 2 Pi}, Axes -> False], {n, 1, 6, 1}]

Я получу много ошибок / предупреждений.Но если я наберу их по отдельности, это работает нормально.Как заставить его работать в одном блоке кода?

Спасибо!

Ответы [ 2 ]

12 голосов
/ 12 января 2011

Как указывает Велисарий, ваш вопрос в некоторой степени 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]

Не знаю, насколько это читабельно, но надеюсь, что это немного поможет ...

2 голосов
/ 06 февраля 2017

Вы должны поместить вызовы Needs[] вверху записной книжки в отдельный блок или в первую изолированную строку файла package.m.

Ядро читает всю строку и анализирует ее, включая выбор контекста для символов, прежде чем приступить к ее оценке. Чтобы избежать проблем, не используйте точки с запятой. Поместите два символа новой строки после каждого оператора в пакете. Особенно после BeginPackage[] и / или Needs[].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...