Ответ 1
Использовать Get; Нужно только загружать пакет, если он не загружен вообще. Иногда вам нужно быть осторожным и использовать ClearAll для переменных в пакете.
Я пытаюсь найти ярлык для следующего цикла. При разработке пакета mathematica реализуются изменения в коде файла .m
, а затем вы хотите протестировать изменения в другом ноутбуке. Это бесконечный цикл...
Итак, у нас есть пакет package.m
и ноутбук test_package.nb
, где выполняется тестирование. В настоящее время, когда когда-либо я что-то меняю в файле .m
, мне нужно:
Quit[]
Needs["package`"]
в записной книжке, чтобы изменения стали доступными, поэтому я могу их протестировать. Кажется, что без Quit[]
он не работает.
Есть ли более короткий способ повторить этот цикл разработки? В частности, избегайте отказа?
Aftermath
Если бы я мог, я бы согласился с ответами ruebenko и Leonid, так как оба они полезны и решают мою проблему. Однако, поскольку можно выбрать только один ответ, я выбрал ruebenko из-за простоты и простоты - просто изменив Needs
на Get
, я преодолел свою проблему. Тем не менее, пакет Leonid наверняка более сложный и, вероятно, в конце дня дает лучшие результаты, но он должен быть установлен, загружен и т.д.
Использовать Get; Нужно только загружать пакет, если он не загружен вообще. Иногда вам нужно быть осторожным и использовать ClearAll для переменных в пакете.
В качестве альтернативы использованию простого Get
, как написано @ruebenko (что является хорошим советом), вы можете попробовать использовать пакет, который я написал, называемый PackageManipulations`
, который делает то, что вы хотите. Он доступен здесь. Существует блокнот с примерами, иллюстрирующими, как он работает, также доступен на странице, с которой я связан. Пакет может перезагрузить, очистить или удалить данный пакет (контекст). Функция PackageReload
специально сделает то, что вы хотите.
Он использует Get
или Needs
под капотом, но кроме того, он будет отслеживать так называемые "экранирующие символы" (символы, которые публично экспортируются, но не имеют сообщений об использовании, и могут "утечка" детали реализации) и, возможно, может решить проблемы с затенением в пользу перезагрузки пакета. Обратите внимание, что PackageReload
будет автоматически вызывать Unprotect
и ClearAll
на символах пакета, поэтому обращается к проблеме, упомянутой @ruebenko. Более подробную информацию вы можете найти в примере ноутбука, который поставляется вместе с пакетом.
Обратите внимание, что, хотя я использовал его сам много раз, я не утверждаю, что он без ошибок:)
Самый простой способ - использовать Clear
или, еще лучше, ClearAll
на отображаемые символы в вашем пакете в самом начале вашего пакета, как показано ниже.
BeginPackage["SomePackage`"];
ClearAll[ ASymbol, AnotherSymbol, ...];
Это гарантирует, что у вас есть чистый лист, когда вы его загружаете. Это проще, если пакет более стабилен, но я считаю, что если я не буду этого делать, когда я изначально разрабатываю пакет, это не делается.