如何在评估时删除输入单元格?

时间:2011-05-06 07:25:40

标签: wolfram-mathematica

我想完成以下内容:在评估输入单元格时,它应该自毁(即删除自身)。我试图与SelectionMoveNotebookDelete一起破解某些东西,但却没有得到我想要的东西。

以下是潜在的用例:

  • 该命令可能是一系列动态生成并插入笔记本的其他命令的简写

  • 该命令可能仅用于副作用(例如设置笔记本选项或打开新笔记本);在评估之后将命令留在笔记本中没有任何意义并且造成混乱

编辑:根据Wizard先生的说法,答案是SelectionMove[EvaluationNotebook[], Previous, Cell]; NotebookDelete[];。我不知道为什么以前不适合我。这是一些使用这个习语的代码。

writeAndEval[nb_, boxExpr_] := (NotebookWrite[nb, 
    CellGroupData[{Cell[BoxData[boxExpr], "Input"]}]];
   SelectionMove[nb, Previous, Cell];
   SelectionMove[nb, Next, Cell];
   SelectionEvaluate[nb]);

addTwoAndTwo[] := Module[{boxExpr},
  boxExpr = RowBox[{"2", "+", "2"}];
  SelectionMove[EvaluationNotebook[], Previous, Cell];
  NotebookDelete[];
  writeAndEval[EvaluationNotebook[], boxExpr];
  ]

现在,正在运行addTwoAndTwo[]会删除原始输入,并使其看起来好像已经评估了“2 + 2”。当然,你可以做各种各样的事情,而不一定要打印到笔记本上。

编辑2:Sasha的抽象非常优雅。如果您对“真实世界”使用此内容感到好奇,请查看我在“工具包中的内容”问题中发布的代码:What is in your Mathematica tool bag?

2 个答案:

答案 0 :(得分:9)

要影响所有输入单元格,请评估这是笔记本:

SetOptions[EvaluationNotebook[], CellEvaluationFunction -> 
  ( (
    SelectionMove[EvaluationNotebook[], All, EvaluationCell]; NotebookDelete[];
    ToExpression@#
  )&)
]

如果您只想影响一个单元格,请选择单元格并使用选项检查器按上述方式设置CellEvaluationFunction

答案 1 :(得分:8)

或者,在Mr. Wizard的解决方案的基础上,您可以创建一个函数SelfDestruct,如果您只想偶尔执行此操作,它将删除输入单元格:

SetAttributes[SelfDestruct, HoldAllComplete];
SelfDestruct[e_] := (If[$FrontEnd =!= $Failed,
   SelectionMove[EvaluationNotebook[], All, EvaluationCell]; 
   NotebookDelete[]]; e)

然后评估2+3//SelfDestruct输出5并删除输入单元格。这种使用场景似乎对我更有吸引力。