From: Hiroshi Igarashi Date: 1998-10-24T07:59:05+09:00 Subject: [ruby-list:10315] Re: 大規模プログラムの友 (Re: for が修飾子だったら ) 五十嵐@早大です。 「[ruby-list:10309] Re: 大規模プログラムの友」で 、 Takashi Nakai さんは書きました: > とここまで書いてきて、実行時にASSERTマクロ風の型チェックは可能 > かな?と思いました。 > > どんな感じかと言うと、この時点では、このオブジェクトは XXXX ク > ラスまたは、その派生型のはず、とか、このオブジェクトは xxx と > yyy と zzz と言うメソッドを持っているはず、とかの宣言です。 > で、実行時のオプション(-w:TYPECHECK ???)で、その宣言のチェッ > クを有効にするとか...(で、違反を検出した時になにをすべき > なんだろう?) > > # --- ここを通過時点では a はIntegerまたはその派生型のはず > TYPECHECK( a is Integer ) > > # --- ここを通過時点では b は下記のメソッドを持っているはず > TYPECHECK( b has getXXX, setYYY, to_s ) > > てな感じですか 僕も個人的なライブラリに def _check_type(obj, tp) unless obj.is_a?(tp) raise "assertion error: #{obj.inspect} is not type #{tp}" end end なんて定義してありますが、面倒であまり使ってないですね。 本当はチェックするべきですが。 そのかわり各メソッドのドキュメントに、 「引数としてクラスCのインスタンスを期待している」 あるいは 「引数がxxxとyyyというメソッドをもっていることを期待している」 を書くようにしています。 加えて http://www.ueda.info.waseda.ac.jp/~igarashi/ruby/index.html#ruby-ifcheck-0.25 にあるようなものを作ったのですが、こちらはまだ利用実績が 少ないです。検査としては非力だと思うのですが、 ドキュメントの生成に役立たせようと、できるだけ使うように しています。 理想を言えば、MLの型推論のように処理系が推論してくれれば 嬉しいのですが、おそらくRubyのような言語だと無理でしょうね。 クラスやメソッドの再定義などを禁じたRubyのサブセットみたいな 言語ではできそうな気がしますが。やっぱり無理かな? ------------------------------------------------------ 五十嵐 宏 (Hiroshi IGARASHI) [早稲田大学理工学部 情報学科4年 上田研究室配属]