Соображения и передовые практики Init.m - PullRequest
9 голосов
/ 14 марта 2011

Поскольку я так и не нашел (или, возможно, никогда не ищу достаточно) хорошую статью о том, как управлять файлами 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`"];

Я не загружаю пакеты из init.m, потому что яМне нужен строгий контроль над тем, что я загружаю, поэтому я определяю здесь только ярлыки для функций утилит, которые я использую ежедневно, и некоторые опции.

Итак: есть ли ссылки на передовой опыт?Лучшие способы достичь такого поведения?Любые предостережения?

Ответы [ 3 ]

7 голосов
/ 14 марта 2011

Во-первых, я бы настоятельно рекомендовал не ставить что-либо существенное 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[]

Вот файл 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[]]
6 голосов
/ 14 марта 2011

Мой Kernel/init.m выглядит так:

AppendTo[$Path, Environment["MMA_LIB"]]
Needs["WRUtil`"]

WRUtil содержит все мои маленькие утилиты и выполняет другую инициализацию, которая учитывает платформу и версию Mathematica. MMA_LIB - это переменная окружения, которая указывает на каталог, полный пакетов Mathematica. Этот каталог находится под контролем версий и может использоваться несколькими экземплярами Mathematica. Мне нравится держать init.m коротким, чтобы перейти к новой установке Mathematica так же просто, как набрать две строки, которые я посвятил памяти - удивительно, как часто мне приходится это делать.

5 голосов
/ 14 марта 2011

Не следуя официальной доктрине, я могу только сказать вам, что я делаю.

My Kernel/init.m не содержит никаких функций. Я использую это для:

  • Установите определенные параметры: $HistoryLength SetDirectory и т. Д.
  • Сделайте небольшую уборку (я предпочитаю не начинать с пустой записной книжки)
  • Установите желаемые DeclarePackage звонки
  • Загрузить пакет пользовательских функций
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...