我尝试在模块中定义一个函数,然后使用 DumpSave
将函数定义保存到一个文件中。但是,重新加载函数失败。这是一个最小的例子
buildf[]:= Module[{res},
res[x_]:=x^2;
res
];
f=buildf[];
DumpSave["f.mx", f];
Clear[f];
Get["f.mx"]
现在我希望 f
是平方函数,但是在 Clear
语句之后它仍然未定义。我该如何解决这个问题?
问题与my earlier question密切相关几个月前,但那里的解决方案对我没有帮助。
感谢任何提示!
更新
buildf
正在读取多个数据文件,转换它们,根据它们定义规则并调用 Dispatch 来快速查找。 buildf
返回的函数类似于数据的 API。我想避免调用 buildf
,而是加载已创建数据函数的二进制转储。
Save
方法看起来很有希望,但它仍然不起作用。我将尝试隔离问题,以便在此处重现。
最终更新 在 @Leonid 评论说局部变量的唯一性不能保证跨 session 之后,我决定只对普通数据结构使用这种“DumpSave 缓存机制”,而不是依赖于其他符号的函数。
最佳答案
您正在从 Module
返回局部变量 (res
)。当然,这是行不通的,您最终得到的是 res
的“本地化”(重命名)版本。
尝试
f = buildf[]
?f
你会得到类似 f=res$538
的东西。此局部变量具有 Temporary
属性,可以随时删除(因此 f
可以停止工作)。
如果您DumpSave
符号f
,它的定义为f=res$538
将被保存,并且可以重新加载(如您可以用 ?f
验证)。但这不是很有用。
这里的问题是:你为什么要使用这个 buildf
函数?你想达到什么目的?
编辑: 正如 Leonid 在下面指出的那样,我上面写的并不完全正确:从 Module
返回的带有 DownValue
的符号做似乎没有被删除,即使它们没有被引用。人们可能仍然想知道这种行为在不同版本之间是否一致以及将来是否相同。
关于wolfram-mathematica - 如何 DumpSave 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7896203/