てきとう

てきとう

1秒間の間、1を足し続ける

procedure Add is
   I:Natural:=0;
begin;
   select
      delay 1.0;
   then abort
      loop
         I:=I+1;
      end loop;
   end select;
end Add;

で良いのかと思ってたら、実行時に無限ループに。
でも、

procedure Add is
   I:Natural:=0;
begin;
   select
      delay 1.0;
   then abort
      loop
         I:=I+1;
         delay 0.0;
      end loop;
   end select;
end Add;

こっちは期待通りに動く……。
何故だ……?

というかこれだと、ARM 9.7.4 Asynchronous Transfer of Controlのサンプルが動かないんじゃないだろうか……。


…とか思ってたら、先人の素晴らしい記事を発見。
というわけで、

procedure Add is
   I:Natural:=0;
begin;
   select
      delay 1.0;
   then abort
      loop
         begin
            pragma Abort_Defer;
            I:=I+1;
         end;
      end loop;
   end select;
end Add;

こんな感じにしてみたけど、、、わざわざbegin..endで囲まなければならない上に、吐くアセンブリがdelay使った時より大きいような……。
delay使った方が良いかな……。