Init.m考虑和良好做法

Dr.*_*ius 9 wolfram-mathematica

由于我从未发现(或者我从来没有找到足够的)一篇关于如何管理init.m文件的好文章,我最终开发了自己的"标准",但我想知道我做得多么糟糕.

例如,我通常的init.m存储在C:\Documents and Settings\All Users\Application Data\Mathematica\Kernel\init.m(Windows)中,我使用文本编辑器对其进行编辑.

由于我不希望定义进入全局上下文,因此内容类似于:

(** User Mathematica initialization file **)
Begin["MyInitContext`"];

Cl:=Clear["Global`*"];
(* Other definitions in this Context *)

End[]; (* End Context *)
$ContextPath = Prepend[$ContextPath,"MyInitContext`"];
Run Code Online (Sandbox Code Playgroud)

我不从init.m加载包,因为我想要严格控制我加载的内容,所以我只在这里定义我每天使用的实用程序函数的快捷方式和一些选项.

那么:有没有提到良好做法?更好的方法来实现这种行为?有什么警告吗?

Jan*_*nus 7

首先,我强烈建议不要放任何重要的东西init.m,因为这会导致旧的东西在几年后再回来时会被打破.好多把路径上您的自定义,因此您可以快速地在每个笔记本的头加载:这样的背景下明确指出,你可以轻松地更改版本不打破旧的东西.

我目前的设置是从目录有一个自定义文件开始Needs["Janus`"],该文件将Janus目录中的init.m每个文件加载到上下文中.这意味着我可以在每个自己的文件中添加实用程序函数,如下一个(clear_cache.m):

ClearCache::usage="ClearCache[f] unsets all numeric-only downvalues of f, \
  see http://stackoverflow.com/questions/5086749"     

Begin["`Private`"];
ClearCache[f_Symbol] := 
  DownValues[f] = DeleteCases[DownValues[f], _?(FreeQ[First[#], Pattern] &)]
End[]
Run Code Online (Sandbox Code Playgroud)

这是文件Janus/init.m.请注意,它打印出已加载扩展名的名称,所有这些都是为了保持上下文显式而不会有太多麻烦.

Module[{packageName,packageFileName,fileNames},
  (* $Input is set to Foo.m when evaluating Foo/init.m *)
  If[$Input=="", Print["init.m cannot run interactively"];Abort[]];
  packageName=StringDrop[$Input,-2];
  packageFileName=FindFile[packageName<>"`"];
  If[packageFileName==$Failed, Print["Unable to find package "<>packageName];Abort[]];
  fileNames=Select[
    FileNames["*.m",{DirectoryName@packageFileName},1],
    FileBaseName[#]=!="init"&];
  Print["Loading extensions from "<>DirectoryName@packageFileName<>" to context "<>packageName<>"`:"];
  BeginPackage[packageName<>"`"];
  Do[Print["Loading "<>fn]; Get@fn, {fn,fileNames}];
  EndPackage[]]
Run Code Online (Sandbox Code Playgroud)


WRe*_*ach 6

Kernel/init.m看起来像这样:

AppendTo[$Path, Environment["MMA_LIB"]]
Needs["WRUtil`"]
Run Code Online (Sandbox Code Playgroud)

WRUtil包含我的所有小实用程序,并执行其他初始化,考虑到平台和Mathematica版本. MMA_LIB是一个环境变量,指向一个充满Mathematica包的目录.该目录保持在版本控制之下,可以由多个Mathematica实例共享.我喜欢保持init.m简短,以便进入一个新的Mathematica安装就像输入我已经承诺记忆的两行一样简单 - 令人惊讶的是我似乎经常这样做.


Mr.*_*ard 5

我也没有遵循官方学说,我只能告诉你我做了什么.

Kernel/init.m本身不包含任何功能.我用它来:

  • 设置某些选项:$HistoryLength SetDirectory
  • 做一点清理(我不想从空白的笔记本开始)
  • 设置我想要的DeclarePackage电话
  • 加载我的自定义函数包

  • 是否有理由不在init.m中声明自定义函数? (2认同)
  • @belisarius我使用`Initialization`单元格从Notebook(.nb)自动生成自定义函数包(.m)文件,这对我来说更方便.但是,我希望能够手动编辑我的`init.m`.这解决了两者.另外,如果我想保留不同版本的`init.m`,我可以更改我的功能而无需同步这些. (2认同)