从Palette操作获取包时出现阴影问题

时间:2011-08-11 11:31:00

标签: wolfram-mathematica

我的简单第一个调色板假设为:

  • 将我的软件包附加到$Path
  • 的路径

ActionMenu["test",{"The Simple Packages Path":> AppendTo[$Path, ToFileName[{NotebookDirectory[], "02 Simple Packages"}]]}]

  • 获取我的包裹

ActionMenu["Load Packages", {"Get my package":> Get["myPackage`"]}]

  • 放置在所选输入单元格(或新输入单元格)上,包含不同占位符的给定输入表达式。

OpenerView[{"my Package", Button["construct", Paste[StandardForm@Defer@construct[Placeholder["description"],Placeholder["another description"]]]]}]

问题是当我点击“获取我的包”操作菜单项时,我不断收到“影子”消息。我确信我不是故意加载包装的。当我点击“构造”时,它会写Global`construct["description","another description"]。但是我确定在获得包之前我没有定义它(我在测试中杀死了内核)。

你知道出了什么问题吗?

(我在我的包上使用Get而不是Needs,以确保包上下文的干净启动)

另外:您是否知道一种更简单的方法Paste[StandardForm@Defer...,即使没有选择单元格,也可以确保未评估粘贴表达式并进入输入单元格?

2 个答案:

答案 0 :(得分:6)

好吧,您的问题似乎是由于解析和界面创建之间的相互作用。在这种情况下你想要的是延迟解析你的界面中的包符号 - 构建代码(你在按钮动作函数中使用的包符号),从界面创建时间到“按下按钮”时间(假设到那个时候,包已经加载了)。这是一种方法:

Column[{ActionMenu["Load Packages",
   {"Get my package" :> Get["ANOVA`"]}],
   OpenerView[{"ANOVA", Button["construct",
       With[{sym = Symbol["ANOVA"]},
         Paste[StandardForm@Defer@sym[Placeholder["DATA"]]]]]}]}]

我们在这里做的是使用With将符号注入到按钮功能的代码中。但是,在解析接口代码时,我们会阻止使用此名称创建Global符号 - 否则会发生这种情况,这就是导致问题的原因。

修改

如果您确定只使用包中的符号(函数)而不是Global'上下文中的符号(函数),那么这个版本将受到“保护”,不会出现此问题:{{1}生成的符号,如果它的上下文结果是Remove - 因此在加载包之前按下按钮只会产生一条警告消息(我使用符号Global'将消息附加到 - 应该用你的界面名称替换 - 制作函数):

package

答案 1 :(得分:2)

好吧,我没有你的包,所以为了测试我改变了动作菜单以获得ANOVA包:

ActionMenu["Load Packages", {"Get my package" :> Get["ANOVA`"]}]

ANOVA[{{1, 1}, {1, 2}, {2, 4}, {2, 3}}]现在可以毫无障碍地运作。没有关于阴影的投诉。这表明你的阴影问题的原因在于其他地方。不过,我注意到ANOVA这个词保持蓝色。这与您报告的问题here有关。