Wolfram mathematica 是否可以在不评估内容的情况下导入MX文件?

Wolfram mathematica 是否可以在不评估内容的情况下导入MX文件?,wolfram-mathematica,Wolfram Mathematica,问题:是否可以在不评估内容的情况下导入使用DumpSave保存的MX文件 让我举例说明: 让我们创建一个变量,data: In[2]:= data = Range[10] Out[2]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 它可以导出到MX或从MX导入,而无需进行任何定义: In[3]:= ImportString@ExportString[data, "MX"] Out[3]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 但是如果我们使

问题:是否可以在不评估内容的情况下导入使用
DumpSave
保存的MX文件


让我举例说明:

让我们创建一个变量,
data

In[2]:= data = Range[10]

Out[2]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
它可以导出到MX或从MX导入,而无需进行任何定义:

In[3]:= ImportString@ExportString[data, "MX"]

Out[3]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
但是如果我们使用
DumpSave

In[4]:= DumpSave["data.mx", data]

Out[4]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}
(并清除数据)

重新导入时,不会返回任何内容:

In[6]:= Import["data.mx", {"MX", "HeldExpression"}]
但是变量
data
再次定义,就好像我们使用了
Get

In[7]:= data

Out[7]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
我希望得到类似于
Hold[data={1,2,3,4,5,6,7,8,9,10}]
,即类似于使用
Save
时写入
.m
文件的内容


也许从技术上来说,避免定义是不可能的,因为
DumpSave
Get
直接操作内核状态,而不是像
Save
那样编写和读取可计算的定义?这只是一个猜测


(编辑)请注意:我不想以可以“保留”导入的方式保存。我已经可以使用
Export
来实现这一点了。我希望导入以前的
DumpSave
dmx文件



答案除非保存MX文件以明确允许,否则不可能执行此操作。

我的理解是.MX文件的逻辑是相反的:加载.MX文件时,符号的定义(
DownValues
和其他)是在最低级别创建的,通过传递主计算器,将值直接分配给内部内存位置。这就是加载.mx文件如此之快的原因。似乎你不能两者兼得——你的期望对应一个更高层次的符号代码。但是,您可以在某些上下文中使用符号作为数据的句柄来封装数据

因此,我看不出这里有什么真正的问题,因为您总是可以查询符号的
DownValues
和其他
…Values
,并以未计算的形式提取规则的r.h.边(有些病理情况下,
DownValues
无法完全重建存储在其中的原始定义,但也就是说,它们的度量值为零,没有多大实际意义)。您可以定义某些接口,允许您通过一些函数(符号)提取数据,而数据可以在封面下使用更多的符号,这些符号将隐藏在这些符号后面

编辑

如果您控制
DumpSave
的初始使用,以下是一种可能性的说明-您可以创建一个自定义的
DumpSave
类函数。这些是准备符号信息的帮助函数:

ClearAll[dress];
dress[prop_] := 
   Function[s, With[{pr = prop[s]}, Hold[prop[s] = pr]], HoldAll]

ClearAll[getHeldProperties];
getHeldProperties[HoldComplete[s_Symbol]] :=
 Thread[
    Through[(dress /@ {
        DownValues, UpValues, OwnValues,
        SubValues, DefaultValues, NValues, 
        FormatValues, Options, Messages, 
        Attributes
      })[Unevaluated[s]]], 
    Hold];
例如:

In[284]:= 
getHeldProperties[HoldComplete[data]]

Out[284]= Hold[{DownValues[data]={},UpValues[data]={},OwnValues[data]={HoldPattern[data]:>
{1,2,3,4,5,6,7,8,9,10}},SubValues[data]={},DefaultValues[data]={},
NValues[data]={},FormatValues[data]={},Options[data]={},Messages[data]={},
Attributes[data]={}}]
现在,主要功能是:

ClearAll[dumpSave];
SetAttributes[dumpSave, HoldRest];
dumpSave[file_String, storage_Symbol, symbs___] :=
  Module[{n = 1},
    Replace[
      Thread[HoldComplete[{symbs}]],
      held : HoldComplete[s_] :> 
         (storage[n++] = getHeldProperties[held]), 
      {1}];
    DumpSave[file, storage]
]
基本上,您可以指定一个符号作为其他符号的未评估定义的存储。以下是如何使用它:

dumpSave["data.mx", storage, data, dumpSave, dress]

如果现在清除
存储
符号并加载回文件,您将看到其他保存符号的所有定义都以未评估的形式存储在
存储
DownValues
中。您只需调用
ReleaseHold
即可实际执行分配,但您也可以在u中访问它们nevaluated form.

首先,让我指出,
DumpSave
似乎有一个未记录的第三个参数。我在搜索包含MX的函数时发现了这一点

请通过计算
?System`Private`BuildApplicationXFunction
(修复这些上下文标记--这样标记就可以防止使用常规符号)亲自查看。请注意,在函数的最后一行,
HoldAllComplete
作为第三个参数给出

不知道这是否有用。不管怎样,这里有一个解决方案,我认为你在问什么

Remove[data, assignment];
assignment := (data = Range[10])
根据需要,您还可以尝试
assignment:=Defer[(data=Range[10])]

现在评估:

DumpSave["data.mx", assignment, HoldAllComplete] (*Also could try Unevaluated as 3rd arg *)
Remove[data, assignment];
Import["data.mx", "HeldExpression"]
请注意,
数据
在评估
分配
之前是未定义的。如果使用
延迟
版本的
分配
数据
将再次未定义,分配将返回(字面上)
数据=范围[10]
您可以使用
Evaluate@@assignment
对原始赋值进行求值,并将其恢复到
数据中


(现在是阅读Leonid的答案的时候了,看看我有多笨!!):D

如果你把内联代码用双反勾(``)括起来然后在其中包含一个反勾号。请参阅我对您答案的编辑。@Szabolcs谢谢。我想我已经尝试过了。有时即时预览看起来很不稳定。另一个问题是内联代码前后的间距。如果您添加空格(像通常一样)它的字体设置为两个空格。不留空格,它看起来应该是这样的。我使用几种不同的浏览器,但大多数时候都使用Chrome。
DumpSave["data.mx", assignment, HoldAllComplete] (*Also could try Unevaluated as 3rd arg *)
Remove[data, assignment];
Import["data.mx", "HeldExpression"]