Syntax 在Mathematica中将控件定义为变量

Syntax 在Mathematica中将控件定义为变量,syntax,wolfram-mathematica,Syntax,Wolfram Mathematica,使用“操纵”时,我可以执行以下操作: Manipulate[x, {u, 1, 10}] 事实上,我的控制是多方面和复杂的,所以我宁愿采取他们的 操纵表达式之外的定义,如下所示: control = {u, 1, 10} Manipulate[x, control] 但这确实会导致错误: Manipulate argument control does not have the correct form for a \ variable specification. 为什么不这样做呢?这个

使用“操纵”时,我可以执行以下操作:

Manipulate[x, {u, 1, 10}]
事实上,我的控制是多方面和复杂的,所以我宁愿采取他们的 操纵表达式之外的定义,如下所示:

control = {u, 1, 10}
Manipulate[x, control]
但这确实会导致错误:

Manipulate argument control does not have the correct form for a \
variable specification.
为什么不这样做呢?

这个

con = {u, 1, 10};
Manipulate[
 u,
 Evaluate@con
 ]
确实有效。我想如果没有
Evaluate
,它就不能工作,因为

Attributes[Manipulate]
显示
operate
具有属性
HoldAll
(但我可能错了)。要查看此属性的效果,请尝试以下操作:

SetAttributes[f, HoldAll]
f[con]
f[Evaluate@con]
g[con]
(*
f[con]
f[{u, 1, 10}]
g[{u, 1, 10}]
*)

因此,似乎由于
HoldAll
atribute,
operate
根本看不到“内部”
con
,除非您明确评估它。

operate
具有。您可以强制
控制
进行评估,一切正常

control = {u, 1, 10};
Manipulate[x[u], Evaluate[control]]
问题是变量
u
未正确定位,因此如果您已经在某个地方设置了,例如
u=1
,则
操作
将返回错误

如果您使用适当的作用域结构,例如
With
DynamicModule
,这可能会更好,具体取决于您正尝试执行的操作

这可能有点过分,但它可以确保
u
是本地的,并将
控件移动到操作之外:

DynamicModule[{u}, With[{control = {u, 1, 10}}, Manipulate[x[u], control]]]

你赢了我那么多!所以+1@Simon谢谢+你也是。我想我最终会得到更少的投票:)谢谢,当我把你的例子复制粘贴到一个新的工作表中时,这就行了。在我的旧工作表中,我必须在每一行上按Shift+Enter键才能工作,即使在control={u,1,10}的行上也是如此,而control={u,1,10}没有改变。“为什么我要重新评估台词?”路德维希,我不知道。这听起来像是行尾字符的问题,但谁知道呢。。。他们是在不同的牢房里结束的吗?(你可以从mma窗口右边缘的单元格括号中看出)@acl:我无法重现错误,它现在可以正常工作了,谢谢。你提供的例子,我在大多数答案中看到的是,代码的复杂性根本没有降低。一些答案创建了一段非常复杂的代码,使用了更多的字符、一堆额外的作用域结构等。我觉得在大多数情况下,只要改进代码的布局(每个控件都在自己的行上,可视化地对相关控件进行分组等)就足够了。通过这些答案,我可以更好地理解正在发生的事情,但是你完全正确:没有一个构造使代码变得更简单。让我疯狂的是我的代码中括号的疯狂嵌套深度。也许这就是Lisp的方法,但是没有办法让我的程序更线性吗?@Sjoerd好吧,如果一段代码出现在一个地方,那么我基本上同意你的看法。如果a)您在多个地方使用代码,或者b)完整的代码太长而无法轻松修改,那么这样做通常是有意义的。例如,我有一个笔记本电脑,上面有一个
操纵
的代码,而我的macbook 13英寸屏幕上没有这个代码。我要么使用这样的技巧,要么每次需要修改的时候都在脑子里装上整个东西。由于我已经在认真思考我实际解决的问题,我宁愿通过添加几个字符来降低代码复杂性。@Sjoerd是对的,布局可以有所帮助。Mma笔记本在缩进行方面做得很好,如果您返回的是显式回车。虽然我回答了你最初的问题,但我认为简化大型操作的更好方法是将控件留在那里,而将其他所有内容移出。请看下面的一些例子。