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 insyntax?

È stato utile?

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:

    .
  1. $ t_1 $ ha tipo $ s $
  2. se $ x $ ha tipo $ t $ quindi $ T_2 $ ha tipo $ u $
  3. $ t_3 $ ha tipo $ U $
  4. 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:

      .
    1. 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.

    2. se $ t_2 $ non ha il tipo $ T $ quindi (1) Valuta a $ T_3 $ . Questo è il "default" che usiamo quando il downcast non è possibile.

    3. 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;
      }
      
      .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top