Wolfram mathematica 如何保存函数?

Wolfram mathematica 如何保存函数?,wolfram-mathematica,Wolfram Mathematica,我尝试在模块中定义函数,然后使用DumpSave将函数定义保存到文件中。但是,重新加载函数失败。这里有一个最小的例子 buildf[]:= Module[{res}, res[x_]:=x^2; res ]; f=buildf[]; DumpSave["f.mx", f]; Clear[f]; Get["f.mx"] 现在我希望f是平方函数,但是在Clear语句之后它仍然没有定义。我如何解决这个问题 这个问题与几个月前密切相关,但那里的解决方案在这里对我没有帮助 任何暗示都感谢

我尝试在模块中定义函数,然后使用
DumpSave
将函数定义保存到文件中。但是,重新加载函数失败。这里有一个最小的例子

buildf[]:= Module[{res},
    res[x_]:=x^2;
    res
];
f=buildf[];
DumpSave["f.mx", f];
Clear[f];
Get["f.mx"]
现在我希望
f
是平方函数,但是在
Clear
语句之后它仍然没有定义。我如何解决这个问题

这个问题与几个月前密切相关,但那里的解决方案在这里对我没有帮助

任何暗示都感谢

更新
buildf
正在读取多个数据文件,转换它们,基于它们定义规则,并调用Dispatch以快速查找。然后,
buildf
返回的函数类似于数据的API。我希望避免调用
buildf
,而是加载已创建数据函数的二进制转储

Save
方法似乎很有希望,但仍然不起作用。我将尝试隔离问题,以便在这里重现它

最终更新
在@Leonid评论说不能保证本地变量在会话中的唯一性之后,我决定只对普通数据结构使用这个“DumpSave缓存机制”,而不是依赖于其他符号的函数

您正在从
模块
返回一个局部变量(
res
)。当然,这是行不通的,您最终会得到一个“本地化”(重命名)版本的
res

试一试

你会得到类似于
f=res$538
的东西。此局部变量具有属性
Temporary
,可以随时删除(因此
f
可以停止工作)

如果您
DumpSave
符号
f
,将保存其定义为
f=res$538
,并且可以重新加载它(您可以使用
?f
进行验证)。但这不是很有用

这里的问题是:为什么要使用这个
buildf
函数?你想达到什么目标


编辑:正如Leonid在下面指出的那样,我上面写的并不完全正确:从
模块返回的带有
DownValue
s的符号似乎不会被删除,即使它们没有被引用。人们可能仍然想知道这种行为在不同版本之间是否一致,将来是否会相同。

如果使用
Save
代替
DumpSave
,您可以看到发生了什么

我得到的文件如下所示:

f = res$636

Attributes[res$636] = {Temporary}

res$636[x_] := x^2
这(
Save
而不是
DumpSave
)实际上是有效的,但我建议在使用
DumpSave
时,
Temporary
属性会导致该属性丢失,或者首先不会保存



我必须拒绝上面的断言,因为我可以手动从
res$*
符号中清除
Temporary
属性,但它仍然无法保存和加载。

这显然比我最初想象的要基本得多。我自己很少使用
DumpSave
,因为创建的是依赖于系统的二进制格式,我认为它的行为很像
Save
。然而,情况似乎并非如此

考虑:

test[x_] := x^2
f = test;
DumpSave["test.mx", f]
Quit[]
其次是:

Get["test.mx"]
Information[f]
Information[test]
Get["test2.m"]
Information[f2]
Information[test2]
在我的系统上,未保存和/或加载
测试的定义

与之相比:

test2[x_] := x^2
f2 = test2;
Save["test2.m", f2]
Quit[]
其次是:

Get["test.mx"]
Information[f]
Information[test]
Get["test2.m"]
Information[f2]
Information[test2]

正确保存并加载了
test2
的定义。

+1用于显示
(转储)Save
也保存了函数的“依赖项”(即保存函数定义中使用的符号定义)。实际上
Save
创建了一个更完整的mx文件,然而,在实际用例中,重新加载的函数不起作用。我在问题中补充了一些关于这个问题的更多信息。你说:“这个局部变量有临时属性,可以随时删除(因此f可以停止工作)。”你能证明这是真的吗?Mathematica真的会垃圾收集这样的东西吗?@Mr.Wizard不,我现在不能,我从文档中得到:“带有临时属性的符号在不再需要时会自动删除。”我也对答案感兴趣,但现在是我的就寝时间。我明天再查:-)好的。我认为关键在于“不再需要”的含义。@Mr.Wizard,Szabolcs只要您从
模块返回一个变量,它就变得不可垃圾回收,所以不用担心这一点。但我不会保存这些符号的定义,或任何涉及它们的表达式,因为它们的唯一性只保证一次Mathematica会话。@Leonid您知道属性
Temporary
的确切功能是什么吗?可能区别在于
Save
根据文档使用
FullDefinition
,而
DumpSave
不使用。