質問

PierceのTAPL本の195ページの

彼は、ある種のダイナミック型テストでダウンキャストオペレータを置き換えることができると述べています。それから彼は次の規則を与えます:

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の各枝の矢は何ですか? insyntaxを含むのはなぜですか?

役に立ちましたか?

解決

最初のルールt typetestはタイプチェックルールです。一緒に読みましょう。第一に、 $ \ gamma $ は重要ではありません(少なくとも最初の読み取り)。次の施設があります。

  1. $ t_1 $ には、type $ s $
  2. $ x $ の場合 $ t $ $ T_2 $ はタイプ $ u $
  3. です。
  4. $ t_3 $ には、type $ u $
  5. 結論は、 $ u $ の表現を取得することです(私はあなたの転記があるべきだと思います " $ : $ \ to t_3 $ の代わりにU $ ""結論): $$ \ mathrm {if} \; T_1 \; \ Mathrm {in} \; t \; \ mathrm {それなり} \; X \ to t_2 \; \ mathrm {else} \; T_3 \タグ{1} $$ この式の意味は、他の2つの規則を見ることによって無制限の操作上の意味論です。これは誤った説明です、私たちは瞬間的に正しいものにします:

    1. $ 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 $ が実行されます。

    2. $ t_2 $ には $ t $ がありません(1)評価 $ t_3 $ へ。これは、ダウンキャストが不可能な場合に使用する「デフォルト」です。

    3. $ t_1 $ の代わりに $ v_1 $ を使用する必要があるため、上記の説明は不正です。作者があなたに言っているのか:最初に $ t_1 $ $ v_1 $ に評価してから、ダウンキャストを実行します。 。

      想像上のOO言語では、同じことが多少このように書かれているかもしれません:

      S t1 = ...;
      ...
      if (t1 instanceof T) {
        T x = (T)t1;
        t2;
      } else {
        t3;
      }
      
      .

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top