Загрузите пакет Mathematica из пакета - PullRequest
13 голосов
/ 05 декабря 2011

У меня более или менее следующие настройки.В ~/path/to/my/packages у меня есть два пакета package1.m и package2.m.Схема каждого пакета, например, следующая:

BeginPackage["package1`"]
Unprotect@@Names["package1`*"];
ClearAll@@Names["package1`*"];

Begin["`Private`"]

vecNorm[vec_?VectorQ]:=Module[{},Return[Sqrt[vec.vec]]];

End[]
Protect@@Names["package1`*"];
EndPackage[]

Теперь моя проблема в том, что я хочу использовать vecNorm, определенный в package1.m в package2.m.Как я могу (безопасно) загрузить package1 изнутри package2?

В настоящий момент я вручную загружаю оба пакета следующим образом:

SetDirectory[StringJoin[NotebookDirectory[], "packages"]];
Needs["package1`"]
Needs["package2`"]

из записной книжки, сохраненной в ~/path/to/my.Я хочу загрузить вручную только package2, который, в свою очередь, загрузит автоматически и безопасно package1.В общем, я хочу решение, которое меняет как можно меньше путей математики.Какой должна быть лучшая практика для достижения этой цели?

PS : Под безопасностью я подразумеваю это в будущем, когда я определю package3, который будет также использовать vecNormи будет загружать package1, а также никаких конфликтов не будет.

1 Ответ

14 голосов
/ 05 декабря 2011

Существует два обычно рекомендуемых способа загрузки пакета.Одним из них является так называемый публичный импорт, и в ваших настройках это будет сделано как

BeginPackage["package2`",{"package1`"}]

(* Usage messages etc *) 

Begin["`Private`"]

(* code here *)

End[]
EndPackage[]

Здесь вы указываете имя контекста пакета, который вы хотите загрузить, в списке, который является вторым необязательным аргументом.до BeginPackage.Этот способ импорта называется общедоступным, поскольку загруженный пакет останется на $ContextPath после загрузки основного пакета и, следовательно, будет общедоступным.

Второй метод называется частным импортом и схематически выполняетсяas

BeginPackage["package2`"]

(* Usage messages etc *) 

Begin["`Private`"]
Needs["package1`"]

(* code here *)

End[]
EndPackage[]

В этом методе ваш загруженный второй пакет будет доступен только для пакета, который его загружает (с Needs), таким образом, частный импорт.

Какой способ вам понадобится, зависит от ситуации.Я пытаюсь сделать весь свой импорт частным, если я не должен делать его публичнымОднако для отладки может быть удобно сначала выполнить публичный импорт, поскольку тогда вы можете поиграть со вторым пакетом непосредственно на верхнем уровне.

Что касается безопасности, вы можете загрузить пакет любымколичество пакетов, и это будет безопасно.Когда вы одновременно загружаете несколько пакетов в один и тот же контекст, это будет безопасно, если у этих пакетов нет открытых символов с одинаковым коротким именем.В противном случае вы столкнетесь с так называемой проблемой слежки, но лучше всего приложить усилия, чтобы этого избежать (это всегда возможно).

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