相关疑难解决方法(0)

将符号公开给$ ContextPath

有多种的Internal`情况下的功能是有用的,如InheritedBlock,BagStuffBag等,以及许多有用Developer`的功能.

我希望公开这些符号的选择,以便可以在没有上下文名称的情况下明确地解决它们,但我不想通过添加Internal`Developer`来公开所有这些符号$ContextPath.

我可以使用代理符号,Bag = Internal`Bag但这既不干净也不完全正确,因为它是一个引用,例如属性不会被继承.

有没有办法有选择地暴露我想要的符号,而不是诉诸上面的kluge?

symbols wolfram-mathematica contextpath

22
推荐指数
2
解决办法
761
查看次数

关于符号定义和价值的问题

Definition"知道"如何定义符号的值:使用SetSetDelayed.但是怎么样?据我了解,在分配符号值后,评估者如何分配符号:使用SetSetDelayed.它可以通过函数来​​说明,该函数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)

wolfram-mathematica

8
推荐指数
2
解决办法
470
查看次数

Mathematica中的动态编程:如何自动定位和/或清除memoized函数的定义

在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 gh每个时间.如果我们有复杂的相互依赖性,这可能是真的很烦人,以清除它们全力以赴我们希望从一个值每一次gh.

有一种简单的方式来运行g,并h …

recursion wolfram-mathematica dynamic-programming exponential

7
推荐指数
2
解决办法
2432
查看次数

用`FullForm`语法保存Mathematica代码

我需要在一个大的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)

syntax parsing wolfram-mathematica metaprogramming

7
推荐指数
2
解决办法
1071
查看次数

如何为上下文生成新的唯一名称?

为某些临时上下文生成名称的最佳方法是什么,该上下文保证是唯一的(系统中不能存在具有此名称的上下文)?

wolfram-mathematica

6
推荐指数
2
解决办法
387
查看次数

Clear []和ClearAll []如何运作?清除[]无法清除两个不同的Manipulate []使用的变量

我有两个不同的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_] …

wolfram-mathematica

4
推荐指数
1
解决办法
2288
查看次数