gpt4 book ai didi

wolfram-mathematica - 从包中加载mathematica 包

转载 作者:行者123 更新时间:2023-12-03 23:44:36 25 4
gpt4 key购买 nike

我或多或少有以下设置。在 ~/path/to/my/packages我有两个包package1.mpackage2.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.mpackage2.m .我怎样才能(安全地)加载 package1来自 package2 ?

目前,我手动加载这两个包,如下所示:
SetDirectory[StringJoin[NotebookDirectory[], "packages"]];
Needs["package1`"]
Needs["package2`"]

来自保存在 ~/path/to/my 中的笔记本.我只想手动加载 package2反过来会自动安全地加载 package1 .一般来说,我想要一个尽可能少地改变数学路径等的解决方案。实现这一目标的最佳实践应该是什么?

PS:我说的安全是指将来,当我定义 package3 时将使用 vecNorm也将加载 package1也不会发生冲突。

最佳答案

有两种通常推荐的加载包的方法。一种是所谓的公共(public)导入,在您的设置中,它将作为

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

(* Usage messages etc *)

Begin["`Private`"]

(* code here *)

End[]
EndPackage[]

在这里,您在列表中指明要加载的包的上下文名称,它是 BeginPackage 的第二个可选参数。 .这种导入方式称为公共(public),因为加载的包将保留在 $ContextPath 上。在您的主包加载后,因此将公开可用。

第二种方法称为私有(private)导入,示意性地完成为
BeginPackage["package2`"]

(* Usage messages etc *)

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

(* code here *)

End[]
EndPackage[]

在这种方法中,您加载的第二个包将仅对加载它的包可用(使用 Needs ),因此是私有(private)导入。

您需要哪种方式将取决于情况。除非我必须将它们公开,否则我会尝试将所有进口商品设为私有(private)。然而,对于调试,首先进行公共(public)导入可能会很方便,因为那时您可以直接在顶层使用第二个包。

至于安全性,你可以通过任意数量的包加载一个包,这将是安全的。当您同时将多个包加载到同一个上下文中时,只要这些包没有具有相同短名称的公共(public)符号,这将是安全的。否则,您将遇到所谓的阴影问题,但最好努力避免这种情况(总是有可能的)。

关于wolfram-mathematica - 从包中加载mathematica 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8385317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com