type check例題

weixin_34008784發表於2017-10-31

Type Checking 做題非常容易錯

6560153-fba1bd7e5bd3fe5b.png

拿到一個Expression的時候第一步先把整個expression寫出來,然後決定按什麼順序Type-Check。

上述let x: Str<-"a" 是第一個要被type check的 Also 每一次assign的時候都要check一下assign value是不是subtype of declare type .所以在接下來type check inner expression的時候, 假設let x: Str<-"a" 已經check好了。因此Environment裡會有一個binding。O[str/x].

接下來要check什麼?很明顯是那個超級長的一串。這裡需要化簡一下,original expression可以看做

let x: str<-"a" in e: Int     整個東西的返回值是Int

所以很明顯 我們要check e, e 就是那個很長的一串。

e = e1 + e2 所以 接下來我們要type check e1, 和 e2.

e1 是 let x: int <- 1 in e   e2是let y: Str<-"a" in e

這裡有一點Tricky,我們之前x不是binding過了嗎?由於closest enclosing principle,內層scope裡的x會被替換成新的值。我們必須同時記住外層和記憶體的bindings,所以寫作:O[string/x][Int/x]


還有一個比較tricky的是if, while 那些condition的表示。

比如if x = y  我們type check 寫: x = y: bool


最後一個就是Type checking的最上層:

O2(x) = Int 就是apply environment function O2 on x, O2因為是O[str/x][int/x] 所以取內層得Int。

所以可見整個Type Check就是不斷check sub expression.


在這題裡我們只用了O environment,因為裡面沒有呼叫dispatch method. 如果涉及function,我們需要用M as well.




Type-derivation第二題:


6560153-41fb3cbba57fbecc.png

從這題稍微看出來一點,Top level: O[type/x][x]=type 表示這個scope裡的x的值。

還有一個Tricky的地方: O[str/x], M |- x: str  Str<=Ob 這裡是declared Type為object的x被assign了一個Str的值。分析一下static type和dynamic type. static=obj, dynamic = string. 我比較不理解為什麼最右邊是O[str/x][ob/x]呢?因為目前看起來x不是一個String嗎? 但是如果這樣還怎麼用dispatch? :好像是因為這裡是一個繼承關係所以method繼承來了。 但是真的要格外小心。。。最記憶體在呼叫type_name()的時候似乎被認為是一個object Type? O[str/x][Ob/x] = ob

原因是因為Type-check只check static Type, dynamic type是run time check的。所以最裡面那層根據declare type來處理。


第三題Tricky:


6560153-7e69359df041f90b.png

我們要知道什麼時候需要O[T/x]什麼時候不需要。這個例子裡第一個O[T/x]之所以不能出現在那裡是因為

evaluate e1的時候也許需要用到outside let scope 裡x 的值, e1是先計算好再assign給x的!


Summary:

Type check之前要先把e 給完整寫出來,然後再type check

let x<-e  , assign的時候 下一步先eval(e), 然後O[type/x]


Dispatch typecheck

6560153-f070c0e4ffa2a734.png

這裡比較Tricky的幾個點:

1. new A: A  A<= A 這一步很容易忘記做,即便這個Type =自己,還是要check。 

2. dispatch check的辦法:

1. 看看M裡存不存在該function   M(class, method) = (formal arg Type, ..., formal arg type, return type) 

到這裡function就算check好了

2. check一下引數: O, M |- 10: Int Int<=Int


最後還是要O[A/a](a) = A 似乎意思就是正式assign a = class A?

相關文章