五十嵐@早大です。

「[ruby-list:10309] Re: 大規模プログラムの友」で 、
Takashi Nakai <nakai / m1.sys.to.casio.co.jp>さんは書きました:

> とここまで書いてきて、実行時に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年 上田研究室配属]