正如文档所说,“DumpSave
以二进制格式写出定义,该格式针对 Mathematica 的输入进行了优化。”有没有办法将 Mathematica 二进制转储文件转换回定义列表而不评估它们? Import["file.mx","HeldExpression"]
不起作用......
答案 0 :(得分:6)
DumpSave
存储与该符号相关联的值,即OwnValues
,DownValues
,UpValues
,SubValues
,DefaultValues
,{{1} },NValues
。
所有评估都在Mathematica的会话中完成,然后FormatValues
保存了它的结果。
这些值存储在内部正式中。读取MX文件只会创建符号,并通过读取此内部格式来绕过评估者来填充这些值。
也许你可以分享促使你提出这个问题的问题。
<小时/> [编辑] 澄清Alexey提出的问题。 MX文件保存符号定义的内部表示。 Mathematica似乎在内部跟踪:
DumpSave
然后,可以使用f[x_Real] := x^2 + 1
DumpSave[FileNameJoin[{$HomeDirectory, "Desktop", "set_delayed.mx"}],
f];
Remove[f]
f[x_Real] = x^2 + 1;
DumpSave[FileNameJoin[{$HomeDirectory, "Desktop", "set.mx"}], f];
setBytes =
Import[FileNameJoin[{$HomeDirectory, "Desktop", "set.mx"}], "Byte"];
setDelayedBytes =
Import[FileNameJoin[{$HomeDirectory, "Desktop", "set_delayed.mx"}],
"Byte"];
来查看差异。我不知道为什么这样做,但我的观点是立场。使用SequenceAlignment[setBytes, setDelayedBytes]
构建的值的所有评估都已在Mathematica会话中完成,然后由Set
保存。读取MX文件时,内部表示将被读回到Mathematica会话中,并且实际上不会对已加载的定义进行评估。
答案 1 :(得分:1)
您可以将Rule
而不是RuleDelayed
分配给DownValues,这相当于直接定义。赋值的右侧保持未评估状态并按字面复制,因此命令对应
Clear[f];
f[x_Real] = x^2 + 1;
DumpSave["f.mx", f];
Clear[f];
f = a;
<< f.mx;
Definition[f]
将是
Clear[f];
f = a;
DownValues[f] := {f[x_Real] -> x^2 + 1}
Definition[f]
f = a
f [x_Real] = x ^ 2 + 1
(参与您的Clear[f]; f = a; f[x_Real] = x^2 + 1; Definition[f]
示例不起作用,而是为a[x_Real]
分配规则。这对先前分配给x
也很有用。
编辑:右侧的副作用并不健全,如下面评论中的示例所示。要分配一个避免任何评估的下限值,可以使用未记录的System`Private`ValueList
,如下所示:
Clear[f];
f := Print["f is evaluated!"];
DownValues[f] := System`Private`ValueList[f[x_Real] -> Print["definition is evaluated!"]];
(无输出)
请注意,分配看似转换为延迟规则:
DownValues[f]
{HoldPattern [f [x_Real]]:&gt; x ^ 2 + 1}
但Definition
(和Save
)表明与:=
的区别在内部得到了保留。我不知道为什么DownValues
没有表现出真相。
要回答原始问题,您可能最好导入转储文件并使用Save
导出相关符号,然后,如果希望将其加载到受先前定义污染的内核中,则转换分配以编程方式进行DownValues
的分配。但是,在导出之前将变量放在私有上下文中可能更容易,这是系统文件为防止冲突所做的事情。