如何在不保存辅助定义的情况下保存与Mathematica中的符号关联的[]定义?

时间:2010-11-04 05:40:48

标签: save wolfram-mathematica

内置的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 个答案:

答案 0 :(得分:9)

根据文档,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 :(得分:1)

我认为

DumpSave["test1", c]  
是的。

示例代码:

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

停止

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

答案 2 :(得分:1)

警告 - 警告 - 我不知道我在做什么

刚发现这是随机浏览帮助系统。

从未使用 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  

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