Leo*_*yev 5 wolfram-mathematica
我想完成以下内容:在评估输入单元格时,它应该自毁(即删除自身).我试图一起砍东西SelectionMove和NotebookDelete,但并没有完全得到我想要的东西.
以下是潜在的用例:
该命令可能是一系列其他命令的简写,这些命令将动态生成并插入笔记本中
该命令可能仅用于副作用(例如设置笔记本选项或打开新笔记本); 在评估后将命令留在笔记本中没有任何意义并且会造成混乱
编辑:按照巫师先生的说法,答案是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工具包中有什么?
要影响所有输入单元格,请评估这是笔记本:
SetOptions[EvaluationNotebook[], CellEvaluationFunction ->
( (
SelectionMove[EvaluationNotebook[], All, EvaluationCell]; NotebookDelete[];
ToExpression@#
)&)
]
Run Code Online (Sandbox Code Playgroud)
如果您只想影响一个单元格,请选择单元格并使用选项检查器进行CellEvaluationFunction如上设置.
或者,在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并删除输入单元格.这种使用场景似乎对我更有吸引力.