Tall.에서 설명한대로 다운 캐스트의 동적 테스트
-
28-09-2020 - |
문제
Pierce의 Tapl Pork의 195 페이지의 경우, 일부 종류의 동적 유형 테스트로 다운 캐스트 연산자를 대체 할 수 있음을 나타냅니다. 그런 다음 그는 다음 규칙을 제공합니다.
t- 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 \ text {} t \ text {그 다음} x \ to t_2 \ text {else} t_3 \ to t_3 : u} $
e-typeTest1 :
$ \ dfrac {\ vdash v_1 : t} {\ text {if} v_1 \ text {in} t \ text {그 다음} x \ to t_2 \ text {else} T_3 \ ~ [x \ mapsto v_1] t_2} $
e-typetest2 :
$ \ dfrac {\ nvdash v_1 : t} {\ text {if} v_1 \ text {in} t \ text {그 다음} x \ t_2 \ text {else} T_3 \ to T_3} $
더 이상 설명은 없으며 이러한 규칙을 해석하는 방법을 알지 못합니다. 그 (것)들을 검토하고, 나는 첫 번째 규칙이며, 두 번째 및 세 번째는 평가 규칙임을 깨닫는다. 그러나 구문은 약간 이상합니다. if의 각 지점에있는 화살표는 무엇입니까? 왜 IF에 in
syntax가 포함되어 있습니까?
해결책
첫 번째 규칙 t- typetest는 유형 검사 규칙입니다. 그것을 함께 읽도록 해 봅시다. 첫째, $ \ gamma $ 은 중요하지 않습니다 (최초의 읽기). 우리는 다음과 같은 구내를 가지고 있습니다 :
- $ T_1 $ 은 $ s $
- $ x $ 은 $ T $ 다음 $ T_2 $ 은 $ u $ 를 가지고 있습니다.
- $ T_3 $ 은 $ u $
-
$ t_1 $ 은 $ T $ (1) < SPAN 클래스="수학 컨테이너"> $ T_2 $ $ x $ $ T_1 $ < / span>. 이것은 "downcast", 즉 $ T_1 $ 이 $ s $ 에서 에서 downcast입니다. SPAN 클래스="Math-Container"> $ T $ , Downcast 값은 $ x $ 및 $ T_2 $ 이 실행됩니다.
-
$ T_2 $ 은 유형 $ T $ (1) 평가 $ T_3 $ . 이것은 다운 캐스트가 불가능할 때 사용하는 "기본값"입니다.
결론은 $ u $ (transcription을 가져야한다 " $를 가져야한다고 생각한다고 생각한다고 생각합니다. : $ \ ~ t_3 $ 에있는 대신 u $ "결론 : $$ \ MATHRM {IF} \; T_1 \; \ mathrm {in} \; t \; \ mathrm {그 다음} \; x \ to_2 \; \ mathrm {else} \; T_3 \ 태그 {1} $$ 이 표현의 의미는 작은 단계의 운영상의 의미 인 다른 두 가지 규칙을 보면서 항해 할 수 있습니다. 여기에 잘못된 설명이 있습니다.
$ T_1 $ 대신 $ v_1 $ 을 사용해야하기 때문에 위의 설명이 잘못되었습니다. 작성자가 귀하에게 알려주고있는 것은 $ T_1 $ 을 $ V_1 $ 으로 평가 한 다음 다운 캐스트를 수행합니다. .
상상의 OO 언어에서도 똑같은 일이 이렇게 쓸 수 있습니다 :
S t1 = ...;
...
if (t1 instanceof T) {
T x = (T)t1;
t2;
} else {
t3;
}
.