Как сохранить [] определения, связанные с символом в Mathematica, без сохранения дополнительных определений? - PullRequest
4 голосов
/ 04 ноября 2010

Встроенная команда Mathematica Save[file, symbol] использует FullDefinition[] для поиска определения symbol и всех вспомогательных определений.

Например, команды

a:=b
c:=2a+b
Save[ToFileName[NotebookDirectory[],"test.dat"],c]

создает файл test.dat, содержащий

c := 2*a + b
a := b

У меня есть программа с большим количеством предопределений MakeBoxes определений типов, которые я не хочу сохранить при сохранении [] множества отдельных результатов.

В терминах простого примера, приведенного выше, я не хочу, чтобы определение a := b было сохранено в файл. Кто-нибудь знает аккуратный способ сделать это?

Ответы [ 3 ]

9 голосов
/ 04 ноября 2010

Согласно документации, Save использует FullDefinition, в то время как вы хотите, чтобы оно использовало Definition. Используя Block, мы можем переопределить глобальное определение любого символа и, в частности, заменить FullDefinition на Definition при выполнении Save:

Block[{FullDefinition},
  FullDefinition = Definition;
  Save[filename, c]
  ];
FilePrint[filename]
DeleteFile[filename]

Магия работает:

c := 2*a + b

EDIT. Завершение вещей с правильными атрибутами:

SetAttributes[truncatedSave, HoldRest]
truncatedSave[filename_, args__] := Block[{FullDefinition},
   FullDefinition = Definition;
   Save[filename, args]];
1 голос
/ 04 ноября 2010

Предупреждение - Предупреждение - я не знаю, что я делаю

Просто нашел это, просматривая справочную систему в случайном порядке.

Никогда прежде не использовал RunThrough ... в любом случае, кажется, делает то, что вы хотите.

Clear["Global`*"];  
a := b;  
c := 2 a + b;  
mathcommand =  StringReplace[First[$CommandLine], "MathKernel" -> "math"];
outputfile = "c:\\rtout";
RunThrough[mathcommand <> " -noprompt", Unevaluated[Put[Definition[c], "c:\\rtout"]]]
FilePrint[outputfile]
Clear[a, c];
<< "c:\\rtout"
DeleteFile[outputfile]
?c  

Out

c := 2*a + b
_______________________________
Global`c
c:=2 a+b

Редактировать .. Работает над списками с небольшим Hold-Fu

Clear["Global`*"];

(*Trick here *)
f[l_] := Definition @@ HoldPattern /@ Unevaluated@l;
SetAttributes[f, HoldFirst];

a := b;
c := 2 a + b;
d := 3 a + b;
mathcommand = StringReplace[First[$CommandLine], "MathKernel" -> "math"];
outputfile = "c:\\rtout";

RunThrough[mathcommand <> " -noprompt",Unevaluated[Put[Evaluate[f@{c, d}], "c:\\rtout"]]]

(* test *)

FilePrint[outputfile]
Clear[a, c, d];
<< "c:\\rtout"
DeleteFile[outputfile]  
?c  
?d   

1 голос
/ 04 ноября 2010

Я думаю

DumpSave["test1", c]  

Делает это.

Пример кода:

a := b;
c := 2 a + b;
DumpSave["test1", c];
Clear[a, c];
<< test1
?a
?c

Out

_____________________
Global`a
_____________________
Global`c
c:=2 a+b
...