ToDo:
よく考えれば当たり前の話ですが、シェルの検索パスとして使える パス名を構成する文字には":"は含まれません
所謂、Bourne shell /bin/shの検索パスは、環境変数PATHに ":"を区切り文字として列挙されるので、":"を含んだパスは 使えません。「バックスラッシュエスケープ出来る」と思う人も 居るかもしれませんが、PATH変数としては"\\"は ただの文字リテラルなのでエスケープ出来ません。
これが、/bin/cshだとシェル変数pathは空白区切りで 設定するので、csh自身がコマンドを探す場合は問題なく 使えてしまうのですが、コマンド検索が/bin/shや system call 経由になった瞬間に誤作動しますので、要注意です。
似たような例に、makeのソースやターゲット名に":"を 含むファイル名が使えないと言う罠もありますね
SADScriptの関数は、内部エラーに関して itfmessage_()関数経由で エラーを通知するものがあります。 これらのエラー通知は、関数の返り値ではなく Messageとして送出され、 Messageが送出された事実はCheck[]関数でトラップすることが 出来るのですが、発生したMessageとその内容を知る術が実はありません Orz コマンドラインからの実行に対しては、MessageList[]関数がありますが Messageの名前だけで付属のパラメータは記録されていません。
つまり、ユーザー定義の関数で、例外が起こり得る関数を呼び出す際に Check[]で例外をトラップし、処理可能な例外は関数内で処理し、 処理できない例外に対しては関数の外側に例外を転送する処理が書けません。
仕方ないので、Add\$Message[]関数に細工して\$MessageLastに 最後に送出されたメッセージを記録するようにしました。
が、Check[]関数では例外を検知しますが、例外発生時点で式の評価が 止まるわけでは無いので、真面目に例外処理を書こうとすると面倒ですね。
Try[]ブロック構文でも、新設すべきかな?
C++の例外機構を知っている人間が勘違いしやすいものに、Catch[]関数が あるのですが、これはThrow[]関数による式評価からの非局所脱出を捕まえる 構文で、例外処理ではない罠。 これって純粋関数とReturn[]で記述できそうな気がしたけど、 純粋関数では Return[]使えないのね... Orz
つまり、f[arg_] := body;は、f := With[{arg = #1}, body];へ 書き換え可能では無いと...
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記