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

Leo*_*yev 5 wolfram-mathematica

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

以下是潜在的用例:

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

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

编辑:按照巫师先生的说法,答案是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];
  ]
Run Code Online (Sandbox Code Playgroud)

现在,运行addTwoAndTwo[]删除原始输入并使其看起来好像您已评估"2 + 2".当然,你可以做各种各样的事情而不必打印到笔记本上.

编辑2:Sasha的抽象非常优雅.如果您对"真实世界"的使用感到好奇,请查看我在" 工具包中的内容"问题中发布的代码:您的Mathematica工具包中有什么?

Mr.*_*ard 9

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

SetOptions[EvaluationNotebook[], CellEvaluationFunction -> 
  ( (
    SelectionMove[EvaluationNotebook[], All, EvaluationCell]; NotebookDelete[];
    ToExpression@#
  )&)
]
Run Code Online (Sandbox Code Playgroud)

如果您只想影响一个单元格,请选择单元格并使用选项检查器进行CellEvaluationFunction如上设置.


Sas*_*sha 8

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

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

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