在声明中重用局部变量With


2

考虑到Mathematica.SE的丰富性,我很惊讶我找不到我的答案......如果它是重复的,我非常抱歉。

请看下面的例子:

With[{t1=0,t2=t1},t1+t2] (* -> t1 *) 

我认为这将打印0而不是t1

事实上,Trace给出:

[email protected][{t1 = 0, t2 = t1}, t1 + t2] 
(* {With[{t1=0,t2=t1},t1+t2],0+t1,t1} *) 

t1保持不计算。

考虑保持和这些属性的一个数学初学者和我一样,在复杂的应用,指出With有属性HoldAlldocumentation,我尝试在不同的地方插入Evaluate,并且还试图通过Module更换With(我承认之间的区别WithModule对我来说不是很明显),但没有印我0而不是t1

如何通知Mathematica评估t2=t1t1t2With内声明?

编辑:由于第一条评论和答案,一些有用的和密切相关的问题和答案可以找到here

  0

有词汇和动态作用域[这里](真的很好的解释http://stackoverflow.com/questions/6236458/plot-using-with-versus-plot -using-block-mathematica/6236808#6236808)和[here](http://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs)。在你的例子中,如果你不想尝试'Block',你可以嵌套两个'With':'[{t1 = 0},With [{t2 = t1},(t1 + t2)]]' 27 8月. 132013-08-27 10:21:27

  0

这是众所周知的。这就是Mathematica的工作原理。没什么新鲜的。尝试'模块[{x = 0,y = x},打印[y]]',它将打印'x'而不是'0'。 Mathematica不会即时更新参数。因此它不使用刚分配的更新值。这是它一直如此。 27 8月. 132013-08-27 10:24:03

+1

我使用的经验法则,以便我不会犯这样的错误,(我想我设置了一些变量为某个值,但它不是),在本地变量中永远不会使用“p1 = p2”名单。如果你必须将'p2'设置为'p1',在参数列表后面,在这里 - >'Module [{p1 = 0,p2},p2 = p1 ....]''''''''''''''''''''''''''' 27 8月. 132013-08-27 10:37:44

  0

@SimonWoods这不是一个完全相同的问题,因为有些人必须知道这个问题的答案:“在您阅读本文之前,先嵌入您的'With'”*您引用的是非常有趣的* q/a。事实上,我只是在评论期间阅读这篇文章。 27 8月. 132013-08-27 13:14:52

  0

@Nasser谢谢我会尽快使用你的建议。你不觉得值得把它作为答案,以便我可以解决这个问题吗? 27 8月. 132013-08-27 13:17:51

2

LetL正是你想要的。你可以看到它的实现here

LetL[{t1 = 0, t2 = t1}, t1 + t2] 
  0

如何将'LetL'用于'With'和'Module'? 'Module [{LetL [{a = 1,b = a + 1,c = a + b + 2},{a,b,c}]},打印[a]; ]'没有工作,并且'Module [LetL [{a = 1,b = a + 1,c = a + b + 2},{a,b,c}],Print [a]; ]'不起作用。是否有使用不同的语法?问题是在'With'和'Module'中使用这个问题,所以我假设可以做到这一点,我只是不能确定语法:) 27 8月. 132013-08-27 12:19:13

  0

@Nasser什么是'Module'的'Attributes' ?谎言你的答案。 :P 27 8月. 132013-08-27 13:27:36