4

デフォルトでは、 Alt+を押すか、評価内で.呼び出すと、現在評価中の入力が中止されます。Abort[]しかし、フロントエンドで作業しているときは、通常、一連の入力をカーネルに送信します。たとえば、次の 3 つの式を 1 行に分けて入力してから+をCell押すと、無限評価が得られます。ShiftEnter

f := CheckAbort[Pause[.1], Abort[]]
While[True, f]
While[True, f]
While[True, f]

この無限の評価を停止するには、Alt+を.3 回押す必要があります。

+を1 回押すと、カーネルを終了せずに入力シーケンス全体の評価を中止するfように、上記の例の関数を定義するにはどうすればよいでしょうか?Alt.

編集

FrontEnd が MathKernel の入力キューを作成する場合、おそらくこのキューもキャンセルできると思います。

4

3 に答える 3

6

4 つのセルだけを使用するという Sasha の提案は有効です。これは基本的にフロントエンドが行うことであり、いくつかの異なる評価をカーネルに送信します。どうしても 1 つのセルを使用する場合は、括弧 ( ) で囲みます。これにより、これら 4 行が 1 つの評価として扱われます (あまりにもCompoundExpression必要であることに注意してください)。;

(
   f := CheckAbort[Pause[.1], Abort[]];
   While[True, f];
   While[True, f];
   While[True, f]
)

その後、アボートが 1 回発行されると、評価全体がアボートされます。

于 2011-04-11T19:11:52.003 に答える
1

アレクセイ、このバージョンのコードを試して、失敗するかどうか、いつ失敗するか教えてください。

AbortAllPendingInputs :=
  AbortProtect[
    $new$PreRead = True;
    $TimeOfAbort = SessionTime[];
    last$PreRead = $PreRead;
    $PreRead = 
      If[
         TrueQ[SessionTime[] - $TimeOfAbort < 1], 
         "",
         $new$PreRead = False; $PreRead = last$PreRead; $PreRead[#]
        ] &;
  ] /; ! TrueQ[$new$PreRead]
于 2011-04-13T07:30:00.640 に答える
1

私は自分がやりたいことをする方法を見つけました。唯一の問題は、現時点では、FrontEnd に保留中の入力があるかどうかを確認する方法がわからないことです。1秒待つだけです。ほとんどの場合、保留中のすべての入力をカーネルに送信するのに十分な時間ですが、常にではありません。

In[1]:= $new$PreRead = False;
AbortAllPendingInputs := 
  AbortProtect[If[! $new$PreRead, $new$PreRead = True;
    $TimeOfAbort = SessionTime[];
    last$PreRead = ToString[Definition[$PreRead], InputForm];
    ClearAll[$PreRead];
    $PreRead := If[TrueQ[SessionTime[] - $TimeOfAbort < 1], "",
       $new$PreRead = False;
       ClearAll[$PreRead];
       If[last$PreRead === "Null", #, 
        ToExpression[last$PreRead]; $PreRead@#]
       ] &;]];

In[3]:= f := CheckAbort[Pause[10], AbortAllPendingInputs; Abort[]]

In[4]:= While[True, f]
While[True, f]
While[True, f]

Out[4]= $Aborted

しかし、私はまだよりエレガントなソリューションを探しています。FrontEnd が MathKernel の入力キューを作成する場合、おそらくこのキューもキャンセルできると思います。

于 2011-04-11T20:01:27.630 に答える