TAPLの説明に従ってダウンキャストの動的検査
-
28-09-2020 - |
質問
彼は、ある種のダイナミック型テストでダウンキャストオペレータを置き換えることができると述べています。それから彼は次の規則を与えます:
typetest:
$ \ dfrac {\ gamma \ vdash t_1:s \;;; \ gamma、x:t \ vdash t_2:u \;; \ gamma \ vdash t_3:U} {\ gamma \ vdash \ text {if} t_1 t \ text {in} t_2 \ t_2 \ t_3 \ t_3 \ t_3:u} $
e-typetest1:
$ \ dfrac {\ vdash v_1:t} {} v_1 \ text {in} t \ text {in} x \ t_2 \ text {else} T_3 \〜[X \ MapSto V_1] T_2} $
e-typetest2:
$ \ dfrac {\ \ dfrac {v_1:t} {} v_1 \ text {In} t \ text {} x \ t_2 \ toxt {else} t_3 \ to t_3} $
それ以上の説明はありません、そして私はこれらの規則の解釈方法を認識していません。それらを確認して、最初のものはタイピング規則であり、2番目と3番目は評価ルールです。しかし、構文は少し奇妙です。 IFの各枝の矢は何ですか? in
syntaxを含むのはなぜですか?
解決
最初のルールt typetestはタイプチェックルールです。一緒に読みましょう。第一に、 $ \ gamma $ は重要ではありません(少なくとも最初の読み取り)。次の施設があります。
- $ t_1 $ には、type $ s $
- $ x $ の場合 $ t $ に $ T_2 $ はタイプ $ u $ です。
- $ t_3 $ には、type $ u $
-
$ t_1 $ の場合 $ t $ があり、(1)を評価します。 span class="math-container"> $ t_2 $ $ x $ $ t_1 $ < /スパン>。これは "downcast"の場合、つまり $ t_1 $ は $ s $ からのダウンキャストです。 Span Class="Math-Container"> $ T $ 、ダウンキャスト値は $ x $ にバインドされてから $ t_2 $ が実行されます。
-
$ t_2 $ には $ t $ がありません(1)評価 $ t_3 $ へ。これは、ダウンキャストが不可能な場合に使用する「デフォルト」です。
結論は、 $ u $ の表現を取得することです(私はあなたの転記があるべきだと思います " $ : $ \ to t_3 $ の代わりにU $ ""結論): $$ \ mathrm {if} \; T_1 \; \ Mathrm {in} \; t \; \ mathrm {それなり} \; X \ to t_2 \; \ mathrm {else} \; T_3 \タグ{1} $$ この式の意味は、他の2つの規則を見ることによって無制限の操作上の意味論です。これは誤った説明です、私たちは瞬間的に正しいものにします:
$ t_1 $ の代わりに $ v_1 $ を使用する必要があるため、上記の説明は不正です。作者があなたに言っているのか:最初に $ t_1 $ を $ v_1 $ に評価してから、ダウンキャストを実行します。 。
想像上のOO言語では、同じことが多少このように書かれているかもしれません:
S t1 = ...;
...
if (t1 instanceof T) {
T x = (T)t1;
t2;
} else {
t3;
}
.