有多种的Internal`情况下的功能是有用的,如InheritedBlock,Bag和StuffBag等,以及许多有用Developer`的功能.
我希望公开这些符号的选择,以便可以在没有上下文名称的情况下明确地解决它们,但我不想通过添加Internal`和Developer`来公开所有这些符号$ContextPath.
我可以使用代理符号,Bag = Internal`Bag但这既不干净也不完全正确,因为它是一个引用,例如属性不会被继承.
有没有办法有选择地暴露我想要的符号,而不是诉诸上面的kluge?
Definition"知道"如何定义符号的值:使用Set或SetDelayed.但是怎么样?据我了解,在分配符号值后,评估者如何分配符号:使用Set或SetDelayed.它可以通过函数来说明,该函数OwnValues总是返回定义Head RuleDelayed.如何Definiton获得这些信息?
In[1]:= a=5;b:=5;
Definition[a]
Definition[b]
OwnValues[a]
Out[2]= a=5
Out[3]= b:=5
Out[4]= {HoldPattern[a]:>5}
Run Code Online (Sandbox Code Playgroud) 在Mathematica 8.0中,假设我有一些常量:
a:=7
b:=9
c:=13
d:=.002
e:=2
f:=1
Run Code Online (Sandbox Code Playgroud)
我想用它们来评估一些相互关联的功能
g[0,k_]:=0
g[t_,0]:=e
g[t_,k_]:=g[t-1,k]*a+h[t-1,k-1]*b
h[0,k_]:=0
h[t_,0]:=f
h[t_,k_]:=h[t-1,k]*c+g[t-1,k-1]*d
Run Code Online (Sandbox Code Playgroud)
但这真的很慢,需要动态编程,否则你会出现指数减速:
g[0, k_] := 0
g[t_, 0] := e
g[t_, k_] := g[t, k] = g[t - 1, k]*a + h[t - 1, k - 1]*b
h[0, k_] := 0
h[t_, 0] := f
h[t_, k_] := h[t, k] = h[t - 1, k]*c + g[t - 1, k - 1]*d
Run Code Online (Sandbox Code Playgroud)
现在,它的真快,但是如果我们想改变常量(比如,在操纵功能,使用此),我们必须Clear g和h每个时间.如果我们有复杂的相互依赖性,这可能是真的很烦人,以清除它们全力以赴我们希望从一个值每一次g和h.
有一种简单的方式来运行g,并h …
recursion wolfram-mathematica dynamic-programming exponential
我需要在一个大的Mathematica代码库(数十万行代码)上做一些元编程,并且不想编写一个完整的解析器,所以我想知道如何最好地从Mathematica笔记本中获取代码用一种易于解析的语法.
是否可以在FullForm语法中导出Mathematica笔记本,或者在语法中保存所有定义FullForm?
该文档的Save说,它可以在唯一的出口InputForm语法,这是不平凡的解析.
到目前为止,我所拥有的最佳解决方案是评估笔记本,然后使用DownValues参数提取重写规则(但这会错过符号定义),如下所示:
DVs[_] := {}
DVs[s_Symbol] := DownValues[s]
stream = OpenWrite["FullForm.m"];
WriteString[stream,
DVs[Symbol[#]] & /@ Names["Global`*"] // Flatten // FullForm];
Close[stream];
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试了各种方法,但没有一种方法效果很好.Mathematica中的元编程似乎非常困难,因为它一直在评估我想要保持不被评估的事物.例如,我想获取无穷大符号的字符串名称,SymbolName[Infinity]但是将Infinity得到的值计算为非符号,并且调用SymbolName带有错误的die.因此,我希望用更合适的语言进行元编程.
编辑
最好的解决方案似乎是手动将笔记本保存为包(.m)文件,然后使用以下代码进行翻译:
stream = OpenWrite["EverythingFullForm.m"];
WriteString[stream, Import["Everything.m", "HeldExpressions"] // FullForm];
Close[stream];
Run Code Online (Sandbox Code Playgroud) 为某些临时上下文生成名称的最佳方法是什么,该上下文保证是唯一的(系统中不能存在具有此名称的上下文)?
我有两个不同的Mathematica笔记本,具有相似但不同的功能.当它们是唯一开放的笔记本时,两者都可以正常工作.尽管我(自由)使用Clear []来清除相关变量,但是当其他笔记本打开时,其中一个始终失败.
称之为GlobalManipulate
ClearAll["Global`*"]
Clear["Global`*"]
Definition[linear]
linear[x_] := a x;
quad[x_] := a x^2;
functionList := {linear, quad};
Manipulate[
Plot[function[dummy], {dummy, -10, 10}],
{function, functionList}, {a, -10, 10},
LocalizeVariables -> False, TrackedSymbols -> All
]
Run Code Online (Sandbox Code Playgroud)
称之为LocalManipulate
Clear["Global`*"];
Manipulate[
{
linear := a x; quad := a x^2;
linear, quad, function,
Plot[ReleaseHold@function, {x, -10, 10}]
},
{function, {HoldForm@linear, HoldForm@quad}},
{a, -10, 10}, TrackedSymbols -> All
]
Run Code Online (Sandbox Code Playgroud)
当它自己运行时,GlobalManipulate按预期工作,我看到更新的图a更改.线性产生的定义Null.
当LocalManipulate打开,运行时,GlobalManipulate不再有效.即使它重新运行它的情节会出现一秒然后消失.
我使用Mathematica 8的本地副本和Mathematica 7的远程副本重现了这一点.
问题必须涉及功能linear[x_] …