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