type check例題
Type Checking 做題非常容易錯
拿到一個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第二題:
從這題稍微看出來一點,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:
我們要知道什麼時候需要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
這裡比較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?
相關文章
- SAP WM中階Storage Type的Capacity Check – Usage check based on SUT
- <input type="file">美化例項程式碼
- <input type="file">美化效果程式碼例項
- [Vue warn]: Invalid prop: type check failed for prop "unlinkPanels". Expected Boolean, got String with value "true".VueAIBooleanGo
- js清空<input type="file">值程式碼例項JS
- 從單例談double-check必要性,多種單例各取所需單例
- vue報錯:[Vue warn]: Invalid prop: type check failed for prop "value". Expected Number, got String....VueAIGo
- SAP WM中階Storage Type的Capacity Check – 根據貨架最大數量檢查
- unexpected reloc type問題分析
- 美化<input type="range">控制元件程式碼例項控制元件
- Type Traits 例項,提高效率 (轉)AI
- onclick="return check()" 和 onclick="check()" 區別
- The method getWriter() is undefined for the type HttpServletRequest的問題UndefinedHTTPServlet
- variable: Type 與 Type variable
- cannot convert (type interface {}) to type int: need type assertion
- 關於j_security_check的問題 高手請指教
- Value Type vs Reference Type in SwiftSwift
- plsql_varray_自定義type之測試小例_user_typesSQL
- 問題一:Content-Type header is not supportedHeader
- 問題No property 屬性名 found for type 類名
- MySQL query_cache_type的DEMAND引數介紹和使用舉例MySql
- js通過type屬性值篩選input元素程式碼例項JS
- check_document_position
- WITH CHECK OPTION 詳解
- Using the WITH CHECK OPTION
- Check database status in RACDatabase
- [Oracle Script] check userOracle
- [Oracle Script] check latchOracle
- Prerequisite check "CheckActiveFilesAndExecutables" failedUIAI
- Availability Check 概念AI
- not null與check is not nullNull
- check ftp success scriptFTP
- 【檢視】with check option
- create view with check optionView
- input框type=file設定cursor:pointer的問題
- 例題2.10
- 例題2.11
- 例題2.12