【文章內容簡介】
(State Seq) ? |? S1: void, ? |? S2: void ? ? |? S1。 S2 : void 簡單類型檢查器的說明 定型規(guī)則 ——程序 (Prog ) ? |? S : void ? ? |? D 。 S : void 簡單類型檢查器的說明 類型檢查 ——聲明語句 D ? D。 D D ? id : T {addtype (, )} T ? boolean { := boolean} T ? integer { := integer} T ? ?T1 { := pointer()} 簡單類型檢查器的說明 類型檢查 ——聲明語句 D ? D。 D D ? id : T {addtype (, )} T ? boolean { := boolean} T ? integer { := integer} T ? ?T1 { := pointer()} T ? array [num] of T1 { := array(, )} 簡單類型檢查器的說明 類型檢查 ——聲明語句 D ? D。 D D ? id : T {addtype (, )} T ? boolean { := boolean} T ? integer { := integer} T ? ?T1 { := pointer()} T ? array [num] of T1 { := array(, )} T ? T1 ??‘ T2 { := ? } 簡單類型檢查器的說明 類型檢查 ——表達式 E ? truth { := boolean } E ? num { := integer} E ? id { := lookup()} 簡單類型檢查器的說明 類型檢查 ——表達式 E ? truth { := boolean } E ? num { := integer} E ? id { := lookup()} E ? E1 mod E2 { := if = integer and E2. type = integer then integer else type_error } 簡單類型檢查器的說明 類型檢查 ——表達式 E ? E1 [E2 ] { := if E2. type = integer and E1. type = array(s, t) then t else type_error } 簡單類型檢查器的說明 類型檢查 ——表達式 E ? E1 [E2 ] { := if E2. type = integer and E1. type = array(s, t) then t else type_error } E ? E1? { := if = pointer(t) then t else type_error } 簡單類型檢查器的說明 類型檢查 ——表達式 E ? E1 [E2 ] { := if E2. type = integer and E1. type = array(s, t) then t else type_error } E ? E1? { := if = pointer(t) then t else type_error } E ? E1 (E2 ) {E. type := if E2 . type = s and E1. type = s ? t then t else type_error } 簡單類型檢查器的說明 類型檢查 ——語句 S ? id := E {S. type := if id. type = E. type then void else type_error } 簡單類型檢查器的說明 類型檢查 ——語句 S ? id := E {S. type := if id. type = E. type then void else type_error } S ? if E then S1 {S. type := if E. type = boolean then S1. type else type_error } 簡單類型檢查器的說明 類型檢查 ——語句 S ? while E do S1 { := if = boolean then S1. type else type_error } 簡單類型檢查器的說明 類型檢查 ——語句 S ? while E do S1 { := if = boolean then S1. type else type_error } S ? S1。 S2 {S. type := if S1. type = void and S2. type = void then void else type_error } 簡單類型檢查器的說明 類型檢查 ——程序 P ? D。 S {P. type := if S. type = void then void else type_error } 簡單類型檢查器的說明 類型轉換 E ? E1 op E2 { := if = integer and = integer then integer else if = integer and = real then real else if = real and = integer then real else if = real and = real then real else type_error } 多 態(tài) 函 數(shù) 為什么要使用多態(tài)函數(shù) 例:用 Pascal語言寫不出求表長度的通用程序 type link = ?cell 。 cell = record info : integer。 next : link end。 多 態(tài) 函 數(shù) function length(lptr : link) : integer。 var len : integer。 begin len := 0。 while lptr nil do begin len := len + 1。 lptr := lptr?. next end。 length := len end。 多 態(tài) 函 數(shù) 用 ML語言很容易寫出求表長度的程序而不必管表元的類型 。 fun length (lptr) = if null (lptr) then 0 else length (tl (lptr)) + 1。 多 態(tài) 函 數(shù) 用 ML語言很容易寫出求表長度的程序而不必管表元的類型 。 fun length (lptr) = if null (lptr) then 0 else length (tl (lptr)) + 1。 length ( [―sun‖, ―mon‖, ―tue‖] ) length ( [10, 9, 8 ] ) 都等于 3 多 態(tài) 函 數(shù) ? 多態(tài)函數(shù) – 允許變元有不同的類型 多 態(tài) 函 數(shù) ? 多態(tài)函數(shù) – 允許變元有不同的類型 – 體中的語句可以在變元類型不同的情況下執(zhí)行(區(qū)別于重載的特征) 多 態(tài) 函 數(shù) ? 多態(tài)函數(shù) – 允許變元有不同的類型 – 體中的語句可以在變元類型不同的情況下執(zhí)行(區(qū)別于重載的特征) ? 多態(tài)算符 – 以不同類型的變元執(zhí)行的代碼段 多 態(tài) 函 數(shù) ? 多態(tài)函數(shù) – 允許變元有不同的類型 – 體中的語句可以在變元類型不同的情況下執(zhí)行(區(qū)別于重載的特征) ? 多態(tài)算符 – 以不同類型的變元執(zhí)行的代碼段 – 例如: 數(shù)組索引 多 態(tài) 函 數(shù) ? 多態(tài)函數(shù) – 允許變元有不同的類型 – 體中的語句可以在變元類型不同的情況下執(zhí)行(區(qū)別于重載的特征) ? 多態(tài)算符 – 以不同類型的變元執(zhí)行的代碼段 – 例如: 數(shù)組索引 、 函數(shù)作用 多 態(tài) 函 數(shù) ? 多態(tài)函數(shù) – 允許變元有不同的類型 – 體中的語句可以在變元類型不同的情況下執(zhí)行(區(qū)別于重載的特征) ? 多態(tài)算符 – 以不同類型的變元執(zhí)行的代碼段 – 例如: 數(shù)組索引 、 函數(shù)作用、通過指針間接訪問 多 態(tài) 函 數(shù) ? 多態(tài)函數(shù) – 允許變元有不同的類型 – 體中的語句可以在變元類型不同的情況下執(zhí)行(區(qū)別于重載的特征) ? 多態(tài)算符 – 以不同類型的變元執(zhí)行的代碼段 – 例如: 數(shù)組索引 、 函數(shù)作用、通過指針間接訪問 – C語言手冊中關于指針 amp。的論述是: 如果運算對象的類型是 ‘ … ’ ,那么結果類型是指向 ‘ … ’ 的指針 ” 。 多 態(tài) 函 數(shù) 類型變量 length的類型可以寫成 ??.list(?) ? integer 允許類型變量出現(xiàn)在類型表達式中,還便于我們討論未知類型 在不要求標識符的聲明先于使用的語言中 ,通過類型變量的使用去確定程序變量的類型。 多 態(tài) 函 數(shù) 例: type link =?cell。 procedure mlist (lptr : link。 procedure p)。 begin while lptr nil do begin p (lptr)。 lptr := lptr?. next end end。 多 態(tài) 函 數(shù) 例: type link =?cell。 procedure mlist (lptr : link。 procedure p)。 begin while lptr nil do begin p (lptr)。 lptr := lptr?. next end end。 p的類型是 link ? void 多 態(tài) 函 數(shù) 例: function deref (p)。 begin return p? end。 多 態(tài) 函 數(shù) 例: function deref (p)。 對 p的類型一無所知: ? begin return p? end。 多 態(tài) 函 數(shù) 例: function deref (p)。 對 p的類型一無所知: ? begin return p? ? = pointer (? ) end。 多 態(tài) 函 數(shù) 例: function deref (p)。 對 p的類型一無所知: ? begin return p? ? = pointer (? ) end。 deref的類型是 ??. pointer (? ) ? ? 多 態(tài) 函 數(shù) 一個含多態(tài)函數(shù)的語言 P ? D。 E 引入類型變量、 D ? D。 D | id : Q 笛卡兒積類型、 Q ? ?typevariable. Q | T 多態(tài)函數(shù) T ? T ??‘T | T ? T | unaryconstructor ( T ) | basictype | typevariable | ( T ) E ? E (E ) | E, E | id 多 態(tài) 函