12
votes

Mettre à jour (recharger) Paquet Mathematica après des modifications

J'essaie de trouver un raccourci vers la boucle suivante. Lorsque vous développez le package de Mathematica, on met en œuvre les modifications du code du fichier , puis souhaitez tester les modifications dans un autre ordinateur portable. Ceci est une boucle infinie ...

Donc, nous avons un paquet package.m et un ordinateur portable test_package.nb où le test est effectué. Actuellement, lorsque je change quelque chose dans le fichier .m , je dois ensuite avoir: xxx

dans l'ordinateur portable pour que les modifications soient disponibles, Donc, je peux les tester. Il semble que sans le quitte [] ça ne fonctionne pas.

Y a-t-il une façon plus courte d'itérer cette boucle de développement? En particulier, évitez le départ?

après mafusion

Si je pouvais, j'accepte les réponses de Ruebenko et de Leonid comme les deux sont utiles et résolvez mon problème. Cependant, comme une seule réponse peut être choisie, j'ai choisi que Ruebenko est dû à la simplicité et à la facilité - en modifiant simplement les besoins sur obtenez Je suis surmonté mon problème. Néanmoins, le paquet de Leonid est certainement sûr plus sophistiqué et probablement à la fin de la journée donne de meilleurs résultats, mais il doit être installé, chargé, etc.


0 commentaires

3 Réponses :


8
votes

utiliser obtenir; Ne doit que charger uniquement le paquet si ce n'est pas du tout chargé. Parfois, vous devez faire attention et utiliser Clearall sur les variables dans l'emballage.


2 commentaires

@Ruebenjo: Pouvez-vous s'il vous plaît élaborer sur le problème Clearall ? Devrait-il être dans le cahier ou dans le fichier .m ?


Dans le fichier .m. Dis que vous modifiez une fonction qui modifie sa signature, si vous obtenez le fichier que l'ancienne définition est toujours dans le noyau. Pour éviter cela, utilisez Clearall [myfunction]; myfunction [blab_, blah_, bla _]: = ...



8
votes

comme alternative à l'utilisation simple obtenir , comme sugetd by @ruebenko (qui est un bon conseil), vous pouvez essayer d'utiliser un package que j'ai écrit appelé packagemanipulations` , qui fait ce que vous voulez. Il est disponible ici . Il existe un ordinateur portable avec des exemples illustrant comment cela fonctionne, également disponible à la page que j'ai liée. Le paquet peut recharger, effacer ou supprimer un package donné (contexte). La fonction packagereload fera spécifiquement ce que vous voulez.

Il utilise obtenez ou ou sous la hotte, mais il suivra en outre les "symboles de l'échappement" (symboles qui sont exportés publiquement mais n'ont pas de Les messages d'utilisation, et peuvent être «fuir» les détails de la mise en œuvre) et peuvent éventuellement résoudre les problèmes d'observation en faveur du paquet rechargé. Notez que packagereload appelle automatiquement non-rétrocet et Clearall sur les symboles de l'emballage, répondant donc au problème mentionné par @ruebenko. Vous pouvez trouver plus de détails dans l'exemple Notebook fourni avec le package.

Notez que, pendant que je l'ai utilisé moi-même plusieurs fois, je ne prétends pas que c'est sans bug :)


6 commentaires

Il est temps de se rapprocher de vos «ressources supplémentaires» ;-)


@nilo de roock Malheureusement, cette section a été la même pour environ 3 ans maintenant (c'est vraiment pathétique). J'ai beaucoup plus que je voudrais y ajouter là, mais jusqu'à présent n'avait pas assez de temps pour emballer, polir et tester correctement. J'espère que je vais mettre à jour ces trucs assez bientôt.


@Leonidshifrin: Merci pour l'addition. J'ai essayé de l'ajouter au début de mon paquet (après non-récupération @@ noms ["curvanalyse *"]; clearall @@ noms ["COREF> *"]; et avant le Premier Utilisation ). Dans le cahier de test, j'ai retourné à Besoins . Ensuite, j'ai essayé de recharger le colis après la modification (sans utiliser Quitter [] ), mais les modifications ne s'appliquent pas. Je devais soit utiliser Quitter [] ou réutiliser le obtenir alternatif.


@Dror Le code que j'ai publié devrait fonctionner - j'ai spécifiquement ajouté le code de test ci-dessus et l'avez testé moi-même. Je ne l'ai pas mentionné, car je pensais que c'était clair du contexte, mais avec cet ajout, vous doit utiliser utiliser obtenir dans tous les cas. Besoins Ne rechargez pas le package une fois qu'il a été chargé. En fait, comme je l'ai déjà mentionné aussi, la fonction packagereload de mon packagemanipulations` est tout ce qui fonctionne pour vous automatiquement, y compris en choisissant lequel à appeler ( a besoin < / Code> ou Obtenez ), appelant non-récupération et Clearall sur tous les noms d'emballage (sous-contextes inclus) et quelques autres choses.


@Leonidshifrin: J'ai bien peur que ce n'était pas si clair pour moi. Toute façon ça marche maintenant. Consultez mon ajout à la question pour plus de détails.


@Dror bien, je vais essayer d'être plus clair la prochaine fois. Gardez à l'esprit que juste appeler obtenir ne résoudra pas votre problème - vous devrez toujours appeler un code similaire à ce que j'ai proposé dans la modification, au début de votre colis, de le rendre robuste (ceci est ce que @Ruebenko a averti de sa réponse).



1
votes

La méthode la plus simple consiste à utiliser Effacer code> ou, mieux encore, Clearall code> sur les symboles exposés Dans votre colis au tout début de votre colis, comme suit

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


6 commentaires

J'ai ajouté (comme je l'ai vu dans un exemple) non-récupération @@ noms ["paquet *"]; Clearall @@ noms ["package *"]; au début de mon colis. Est-ce que cet équivalent et aborde le même problème?


@RCollyer Ce serait une solution parfaite si l'un ou l'autre des paquets ne serait pas évolué ou que l'écrivain serait très discipliné (je n'étais pas). Je faisais cela aussi bien pendant un moment, mais presque chaque fois que j'ai eu quelques nouvelles fonctions ajoutées et que j'ai oublié de les ajouter à Clearall . Quand je me suis fatigué des bugs méchants résultant de définitions plus anciennes séjournant avec les nouvelles pour ces fonctions, j'ai écrit le colis que j'ai mentionné dans ma réponse. Et j'ai été heureux (en ce qui concerne cette question) depuis :)


@Leonidshifrin, j'ai dit que c'était le plus facile à mettre en œuvre, je n'ai pas dit que c'était une solution robuste. Mais qu'en est-il de la variante de Dror? Cela ne fonctionnerait-il pas?


@RCollyer Ce ne serait pas toute l'histoire car il ne ferait que clarifier les symboles dans le contexte principal. On aurait également besoin d'appeler Clearall sur tous les sous-contextes (généralement, il s'agit simplement de privé` ). Avec cette correction, cela fonctionnerait probablement. C'est à peu près ce que fait mon colis, mais cela fait tout cela automatiquement et a une fonctionnalité supplémentaire.


@Leonidshifrin: Pouvez-vous écrire le code explicite que vous pensez ajouter pour avoir mon approche robuster? Merci.


@Dror j'ai ajouté du code et de l'exemple d'utilisation, s'il vous plaît voir mon édition