まつもと ゆきひろです

In message "[ruby-list:5322] Questions on specs and threads"
    on 97/11/18, Kazuhisa Yanagawa <katze / yuba.is.uec.ac.jp> writes:

|  はじめまして. 読んでただけで今まで書いたことが無かったものです.

はじめまして.

|  1) case 文について
|
|     case 文で when 節に配列を書くとマッチしません.

whenには「when 1,2,3」というような書き方を許していますので,
配列の === を再定義することは考えていませんでした.検討して
みます.

|  2) typecase
|
|     typecase のようなものはいりませんでしょうか? if-elsif-else-end で
|     十分という意見は確かにあるのですが.

実はModule#===が再定義されているので,以下のような使い方が出
来ます.

  case obj
  when String
    ...
  when Object
    ...
  else
    ...
  end

1.1ではObject.typeを使って,別の書き方も出来ます.

  case obj.type
  when String
    ...
  when Object
    ...
  else
    ...
  end

|  3) 記号的な記法
|
|     これは単なる私の趣味ですが, 単項インクリメントとかがたまに欲しく
|     なります. i += 1 でいいわけですが. i++ と書いて怒られる (^^;

すんません.この件は以前から指摘されているのですが(演算子はC
に似ているのに++と--は対応する演算子が無い),++の動作が本質
的に「変数を操作する」ものであるため,変数がオブジェクトでな
いRubyでは導入できないでいます.++や--の「オブジェクト指向的
意味」がRubyの他の部分と整合性を保ったまま定義できれば採用し
たいのですが….

|     SR 風な(CSP 風な?)
|
|       if condition1
|         ...
|       [] condition2
|         ...
|       [] else
|         ...
|       end
|
|     なんてのも好きかもしれない.

すいません.これどういう動作なんでしょう? CSPには弱くて….
# Betaもよく分かんなかったなあ.

|  4) thread についての疑問
|
|     これは今までのとは何の関係もありませんが....最後に付けたようなス
|     クリプトがデッドロックします. 結局は Queue#push に変な引数を与え
|     るのが悪いのですが, なんで Wrong # of arguments(3 for 1) とかにな
|     らないのかが理解できません.

これは「Thread内部で発生した例外は,デフォルトではそのthread
を終了させて,外に通知しないから」でしょう.この動作そのもの
は仕様です.で,それに対する対策は以下のいずれかです.

  * Thread#valueでthreadの終了をチェックする.例外で終了して
    いると例外を再発生させる

  * プログラムの先頭で「Thread.abort_on_exception = TRUE」と
    しておく,例外が発生した時点でプログラム全体が終了する.

|  5) どこかに exception の一覧があったりしないでしょうか. TypeError と 
|     RuntimeError ぐらいしか把握できなかったりするんですが.

えーと,以前メール[ruby-list:881]で書いたきりどこにも載せて
いませんドキュメントをそろえるのは今後の課題ですね.再掲して
おきます.

    現状のruby例外(大域脱出)一覧

        GlobalExit すべての大域脱出の親
          Fatal 捕捉できない
          Interrupt 割り込み
          SystemExit exitで発生
          Exception 全ての通常例外の親
            RuntimeError とくに限定なし
            SyntaxError evalでの文法エラー
            LocalJumpError 不正なbreak/next/redo..
            TypeError 型が合わない
            ArgumentError 引数の数が合わない
            NameError 定義されていない名前を参照
            IndexError インデックスが範囲外
            NotImpError このOSでは実装されていない
            LoadError ロードするファイルが無い
            IOError sytem call以外のIOエラー
            EOFError EOFに出会った
            SocketError ソケットのエラー
            SecurityError safe.rbで定義されてる
            SystemCallError システムコールエラーの親
              Errno::ENOENT ...

  * rescue節の後ろで例外の型を指定することで捕捉できる
  * rescueのデフォルトはExceptionを捕獲する
  * Fatal以外はrescueで明示的に指定することで捕獲できる
  * Fatalだけはどうやっても捕捉できない

|# 大雑把に言って, active object の手抜きな実装....のプロトタイプ.
|# Actor は send で送られて来たメッセージを disp でディスパッチしたい.

これ結構面白いっすね.

                                まつもと ゆきひろ /:|)