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

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

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

Quit[]
Needs["package`"]

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

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

отава

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

3 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам