
Toyland 程式設計
|
315
我們將以程式外部本身提供的型別脈絡的易懂想法來解決這種緊張關係,並且不會由個
別的陳述式更新。這的確會排除某些類型的程式,並且很明確會避免引起這種型別脈絡
的問題,包括問題的原因和源頭,但它會讓靜態語意保持簡單,並且提供我們可以輕鬆
處理的規則。
對於指定陳述式而言,我們可以假設運算式的型別應該符合它的值所指定的變數型別:
class Assign
def type(context)
if context[name] == expression.type(context)
Type::VOID
end
end
end
這個規則對我們可以事先決定每個變數型別並保持它不變的所有程式都已經足夠,而且這
些限制都還可以接受。舉例來說,我們可以檢查第 2 章實作過的動態語意
While
迴圈:
>> statement =
While.new(
LessThan.new(Variable.new(:x), Number.new(5)),
Assign.new(:x, Add.new(Variable.new(:x), Number.new(3)))
)
=> «while (x < 5) { x = x + 3 }»
>> statement.type({})
=> nil
>> statement.type({ x: Type::NUMBER })
=> #<Type void>
>> statement.type({ x: Type::BOOLEAN })
=> nil
好處和限制 ...