Wolfram mathematica 为了在宏中使用,有没有技巧将两个Item[]表达式组合成一个表达式?

Wolfram mathematica 为了在宏中使用,有没有技巧将两个Item[]表达式组合成一个表达式?,wolfram-mathematica,Wolfram Mathematica,第8.04节。这是在操作仅使用的上下文中 下面是一个简单的示例,使用一个项在UI中的不同位置使用操纵来放置控件 Manipulate[Plot[Sin[z], {z, -Pi, Pi}, ImageSize -> 100], Item[Control[{{x, 0, "x="}, 0, 10, 1,ImageSize->Tiny}],ControlPlacement->Left], Item[Control[{{y, 0, "y="}, 0, 10, 1,ImageSize

第8.04节。这是在
操作
仅使用的上下文中

下面是一个简单的示例,使用一个项在UI中的不同位置使用操纵来放置控件

Manipulate[Plot[Sin[z], {z, -Pi, Pi}, ImageSize -> 100],
 Item[Control[{{x, 0, "x="}, 0, 10, 1,ImageSize->Tiny}],ControlPlacement->Left],
 Item[Control[{{y, 0, "y="}, 0, 10, 1,ImageSize->Tiny}],ControlPlacement->Right]
 ]

然而,我正在使用Leonid的宏方法(link)来帮助我构建UI控件,所以我想做如下事情

 Manipulate[Plot[Sin[z], {z, -Pi, Pi}],

 Evaluate@With[{im = ImageSize -> Tiny},

   Item[Control[{{x, 0, "x="}, 0, 10, 1, im}],ControlPlacement -> Left],
   Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]

   ]    
 ]
上述方法不起作用,因为我们不再有一个表达式可以使
一起快乐,它具有语法

 With[{x=x0}, expression ]
在上面,2
项现在不是一个表达式,而是2

只有当我想使用
控制放置时,才会出现此问题。否则,我将使用
Grid[]
并在
网格
中组合我的不同内容,然后问题就解决了

但我当然不能在网格中使用
来使每个
位于不同的位置。整个
网格
必须位于一个位置

我认为将这两个项目包装在一个
序列[]
中可能会起作用,但事实并非如此

问题是:有没有技巧将上述两项组合成一个表达式来表达快乐?

目前,我在我的UI中解决了这个问题,只需将事物分成两个独立的
,如下所示:

Manipulate[Plot[Sin[z], {z, -Pi, Pi}],

 Evaluate@With[{im = ImageSize -> Tiny},
   Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], 
    ControlPlacement -> Left]
   ],

 Evaluate@With[{im = ImageSize -> Tiny},
   Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], 
    ControlPlacement -> Right]
   ]

 ]
Manipulate[
 Plot[Sin[z], {z, -Pi, Pi}],
 Evaluate @ With[{im = ImageSize -> Tiny},
   ## &[
    Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left], 
    Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
   ]
  ]
] 
而且效果很好

但是,当然,在上面,我失去了使用宏名称在许多控件构造代码之间共享的一些好处

2011年12月26日晚上8:37更新

下面是一个例子,在另一个宏中使用一个宏。我认为这是一个搁置的问题。下面显示的技巧对此不起作用。我将尝试解决这个问题:(在实践中,我使用两个级别的宏,因为我在一个级别定义了一些宏,并使用它们在第二个级别构建更高级别的宏。这里我只展示了一个非常简单的示例来说明我的意思)

我几乎可以肯定,我需要一个
HoldAll
东西插入到正确的位置来解决这个问题。我会设法弄清楚并在这里报告。咖啡快喝完了;)

晚上9点更新

好的,向导先生告诉我上面的问题。我不应该对内部宏进行求值。我忘了这件事。现在就在这里,它工作得很好:

Manipulate[Plot[Sin[z], {z, -Pi, Pi}],

 Evaluate@With[{},

   With[{},
    ## &[
     Item[Control[{{x, 0, "x="}, 0, 10, 1}], ControlPlacement -> Left], 
     Item[Control[{{y, 0, "y="}, 0, 10, 1}], ControlPlacement -> Right]
     ]

    ](*close second With*)
   ](*close first With*)

 ](*close Manipulate*)

谢谢你的回答,都很有用

不要忘记
顺序
应用

Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
 Evaluate[
  Sequence @@ With[{im = ImageSize -> Tiny},
    Hold[
     Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left],
     Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
    ]
   ]
]]

布雷特的回答让我意识到同样的事情可以做得更简洁,比如:

Manipulate[Plot[Sin[z], {z, -Pi, Pi}],

 Evaluate@With[{im = ImageSize -> Tiny},
   Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], 
    ControlPlacement -> Left]
   ],

 Evaluate@With[{im = ImageSize -> Tiny},
   Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], 
    ControlPlacement -> Right]
   ]

 ]
Manipulate[
 Plot[Sin[z], {z, -Pi, Pi}],
 Evaluate @ With[{im = ImageSize -> Tiny},
   ## &[
    Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left], 
    Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
   ]
  ]
] 

由于
With
没有
SequenceHold
属性,我们不能简单地对[Item,Item]进行排序,但我们可以使用
#&[Item,Item]
,因为
&
延迟了评估。

使用
序列
,可能类似于:

Manipulate[
   Plot[Sin[z], {z, -Pi, Pi}], 
   Evaluate@With[{im = ImageSize -> Tiny}, 
      Sequence @@ {
         Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left], 
         Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
         }
      ]
   ]
编辑

相同的方法,但使用不同的宏(警告,这种方式会导致疯狂…)

操纵[
图[Sin[z],{z,-Pi,Pi}],
评估@With[{
control=函数[{var,name,place},
项[Control[{{var,0,name“=”},0,10,1,ImageSize->Tiny}],ControlPlacement->place],
霍德尔
]}, 
序列@{control[x,“x”,Left],control[y,“y”,Right]}
]]

有趣的变化。这两种版本都有好处还是坏处?@Mr.Wizard我不认为这两种版本都有好处。我的第一次尝试与您的类似,只是我试图避免使用括号和方括号,以及
Evaluate@Sequence@@With[…]
的优先级错误。如果没有其他东西的话,它的优点是让我考虑将
序列
放在
中,这样我就可以看到我认为是“正确的”这样做的方法。(见我的最新答案。)@MrWizard,+100,我现在不确定这是怎么回事,我需要通过手术将它分解并研究它,以找出答案,但它是有效的!谢谢。@Nasser,这和Brett的方法是一样的,只是我用
序列
放在
之外,并使用
保持
来确保没有任何过早的评估,尽管我不确定这是否真的需要。请查看我的更新,因为我认为这是一种更干净的方法,因为它不需要
Apply
@MrWizard,我现在正试图让您的
##&
方法适用于嵌入式宏,这是我真正拥有的,不是一个级别,但需要更多的时间。我现在正在煮咖啡,我希望能很快弄明白。我的例子是一个层次,因为我认为这不会有什么不同。我在更新中举例说明了我的意思。但如果可以的话,我会尝试自己解决这个问题,这是一个挑战:)@Nasser,只要去掉你内心的
Evaluate
——如果需要的话,我可以添加一个例子。@MrWizard,谢谢!你是对的。我以前被这个(对内部宏进行评估)咬了一口,然后就忘了这一切。是的,就是这样。它现在工作得很好。现在我要把这个加入我的Mathematica大备忘单。