В Mathematica всегда есть несколько способов сделать то же самое. Например, при адаптации решения WReach для моей недавней проблемы я использовал Condition
:
ClearAll[ff];
SetAttributes[ff, HoldAllComplete];
ff[expr_] /; (Unset[done]; True) :=
Internal`WithLocalSettings[Null, done = f[expr],
AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]; Unset[done]]]
Однако мы можем сделать то же самое с Block
:
ClearAll[ff];
SetAttributes[ff, HoldAllComplete];
ff[expr_] :=
Block[{done},
Internal`WithLocalSettings[Null, done = f[expr],
AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]]]]
Или с помощью Module
:
ClearAll[ff];
SetAttributes[ff, HoldAllComplete];
ff[expr_] :=
Module[{done},
Internal`WithLocalSettings[Null, done = f[expr],
AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]]]]
Возможно, существует несколько других способов сделать то же самое. Какой способ является наиболее эффективным с точки зрения использования памяти и процессора (f
может возвращать очень большие массивы данных, но может возвращаться очень мало)?