Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

octaveにあるunwind_protect構文はエラーでも通常処理でも発火するとunwind_protect_cleanupに移行する

unwind_protectなる構文を見つけました。
とはLispで使われてる構文らしい。
unwindableで巻き戻しできないという意味があるので、unwind_protectは巻き戻し防止って訳でしょうかね……?
Try-Catch構文は別に存在しているらしく、使い分けが……???
調べてみると

  • unwind_protectは通常処理、エラーを問わずunwind_protectからunwind_protect_cleanupを実行
  • tryはエラーが生じたときのみ、catchのなかを実行

という事みたい。
そういえば、こんな構文があるってLand of Lispで読んだ気がする……。

実際のところ

以前やったOctaveでArduino IDEのシリアルプロッタみたいな事をするライブラリsplotで使てました。
概要だけつまみだすと、以下のような感じ。
エラーキャッチをメインに使ってますね。

unwind_protect
srl_flush(s1);
    %% 通常処理
    while true
        % 読み取り処理
    endwhile
unwind_protect_cleanup
    %% クローズ処理
    srl_close(s1);
end

他にはグローバル変数の再初期化なんかにも使う様子。
フラグと組み合わせることで、特定のエラーなりプロセス終了のみに特化した処理をIF文で分けるとか。