9.3
応用
307
されます。したがって、
Ruby
では同じ変数に別の型の値を代入することが許されています。
ただし、これにはプログラム実行前に型に関するバグを検出できないという代償を伴います。
この型システムは、ある特定の方法でうまくいかなくなるプログラムしかチェックしていません。構
文の各パーツの動的意味論は処理する値の型が何であるかを期待しており、型システムはその期待が
満たされるかチェックしています。たとえば、ブール値が期待されているところに数が現れないか、確
かめているわけです。ところが、この静的意味論がチェックしていない別の理由によって、うまくいか
なくなるプログラムもあります。たとえば、この型システムは変数の使用前に変数に値が与えられてい
るかを気にしていません。したがって、未初期化の変数を含んだプログラムは、型チェッカーをパスし
て評価時に失敗することになります。
>>
statement = Assign.new(:x, Add.new(Variable.new(:x), Number.new(1)))
=> «x = x + 1»
>>
statement.type({ x: Type::NUMBER })
=> #<Type void>
>>
statement.evaluate({})
NoMethodError: undefined method `value' for nil:NilClass
型システムから得られるどのような情報も、疑ってかかる必要があります。どれくらい信頼する