Обновление (перезагрузка) пакета mathematica после изменений

Я пытаюсь найти ярлык для следующего цикла. При разработке пакета mathematica реализуются изменения в коде файла .m, а затем вы хотите протестировать изменения в другом ноутбуке. Это бесконечный цикл...

Итак, у нас есть пакет package.m и ноутбук test_package.nb, где выполняется тестирование. В настоящее время, когда когда-либо я что-то меняю в файле .m, мне нужно:

Quit[]
Needs["package`"]

в записной книжке, чтобы изменения стали доступными, поэтому я могу их протестировать. Кажется, что без Quit[] он не работает.

Есть ли более короткий способ повторить этот цикл разработки? В частности, избегайте отказа?

Aftermath

Если бы я мог, я бы согласился с ответами ruebenko и Leonid, так как оба они полезны и решают мою проблему. Однако, поскольку можно выбрать только один ответ, я выбрал ruebenko из-за простоты и простоты - просто изменив Needs на Get, я преодолел свою проблему. Тем не менее, пакет Leonid наверняка более сложный и, вероятно, в конце дня дает лучшие результаты, но он должен быть установлен, загружен и т.д.

Ответ 1

Использовать Get; Нужно только загружать пакет, если он не загружен вообще. Иногда вам нужно быть осторожным и использовать ClearAll для переменных в пакете.

Ответ 2

В качестве альтернативы использованию простого Get, как написано @ruebenko (что является хорошим советом), вы можете попробовать использовать пакет, который я написал, называемый PackageManipulations`, который делает то, что вы хотите. Он доступен здесь. Существует блокнот с примерами, иллюстрирующими, как он работает, также доступен на странице, с которой я связан. Пакет может перезагрузить, очистить или удалить данный пакет (контекст). Функция PackageReload специально сделает то, что вы хотите.

Он использует Get или Needs под капотом, но кроме того, он будет отслеживать так называемые "экранирующие символы" (символы, которые публично экспортируются, но не имеют сообщений об использовании, и могут "утечка" детали реализации) и, возможно, может решить проблемы с затенением в пользу перезагрузки пакета. Обратите внимание, что PackageReload будет автоматически вызывать Unprotect и ClearAll на символах пакета, поэтому обращается к проблеме, упомянутой @ruebenko. Более подробную информацию вы можете найти в примере ноутбука, который поставляется вместе с пакетом.

Обратите внимание, что, хотя я использовал его сам много раз, я не утверждаю, что он без ошибок:)

Ответ 3

Самый простой способ - использовать Clear или, еще лучше, ClearAll на отображаемые символы в вашем пакете в самом начале вашего пакета, как показано ниже.

BeginPackage["SomePackage`"];
ClearAll[ ASymbol, AnotherSymbol, ...];

Это гарантирует, что у вас есть чистый лист, когда вы его загружаете. Это проще, если пакет более стабилен, но я считаю, что если я не буду этого делать, когда я изначально разрабатываю пакет, это не делается.