Test dinamici dei cast giù come spiegato in TAPL
-
28-09-2020 - |
Domanda
A pagina 195 di Pierce's Tapl Book, afferma che si può sostituire un operatore in fusione in down da una sorta di test dinamico di tipo. Quindi dà le seguenti regole:
t-typtest:
$ \ dfrac {\ gamma \ vdash t_1: s \; \; \ Gamma, x: t \ vdash t_2: u \; \; \ Gamma \ VDash T_3: u} {\ gamma \ vdash \ testo {if} t_1 \ testo {in} t \ text {quindi} x \ to t_2 \ text {altrimenti} t_3 \ to t_3: u} $
E-typtest1:
$ \ dfrac {\ vdash v_1: t} {\ text {if} v_1 \ text {in} t \ testo {quindi} x \ to t_2 \ testo {altro} T_3 \ a [x \ mapsto v_1] t_2} $
E-typtest2:
$ \ dfrac {\ nvdash v_1: t} {\ text {if} v_1 \ text {in} t \ text {then} x \ to t_2 \ testo {altro} t_3 \ to t_3} $
Non ci sono ulteriori spiegazioni e non sono consapevole di come interpretare queste regole. Esaminandoli, mi rendo conto che il primo è una regola di battitura e il secondo e il terzo sono le regole di valutazione. Tuttavia, la sintassi è un po 'strana. Quali sono le frecce in ogni ramo del se? Perché l'IF include il in
syntax?
Soluzione
La prima regola T-Typetest è una regola di controllo del tipo. Leggiamolo insieme. Innanzitutto, $ \ gamma $ non è importante (almeno in prima lettura). Abbiamo i seguenti locali:
- .
- $ t_1 $ ha tipo $ s $
- se $ x $ ha tipo $ t $ quindi $ T_2 $ ha tipo $ u $
- $ t_3 $ ha tipo $ U $
-
se $ t_1 $ ha tipo $ T $ quindi (1) Valuta a < Span Class="Math-Container"> $ T_2 $ con $ x $ sostituito da $ t_1 $ < / span>. Questo è il caso di "downcast", cioè, $ t_1 $ è abbattuto da $ s $ a < Span Class="Math-Container"> $ T $ , il valore del downcast è destinato a $ x $ e poi $ T_2 $ è eseguito.
-
se $ t_2 $ non ha il tipo $ T $ quindi (1) Valuta a $ T_3 $ . Questo è il "default" che usiamo quando il downcast non è possibile.
Le conclusioni sono, che otteniamo un'espressione di tipo $ U $ (penso che la tua trascrizione dovrebbe avere " $ : U $ "invece di $ \ to t_3 $ la conclusione): $$ \ mathrm {if} \; t_1 \; \ mathrm {in} \; T \; \ mathrm {then} \; x \ a t_2 \; \ mathrm {altrimenti} \; T_3 \ tag {1} $$ Il significato di questa espressione può essere UNDRSTOOD osservando le altre due regole, che sono semantiche operative di piccole-gradini. Ecco una spiegazione errata, che faremo correggere in un momento:
- .
La spiegazione sopra non è corretta perché dovremmo usare $ v_1 $ anziché $ T_1 $ , di quale autore ti sta dicendo: prima valutare $ t_1 $ a $ v_1 $ , quindi eseguire il downcast .
In un linguaggio immaginario OO la stessa cosa potrebbe essere scritta un po 'come questo:
S t1 = ...;
...
if (t1 instanceof T) {
T x = (T)t1;
t2;
} else {
t3;
}
.