조건이 참일 경우 True 브랜치를, 거짓인 경우 false 브랜치를 실행한다.
if-else
if-then-else
e1 ? e2 : e3
조건문에서 특정 언어에서는 statement를 사용하고 다른 언어에선 expression을 사용한다.
expression
evaluate to value. 메모리 변경이 없다. 함수형 언어 특징.
addition, subtraction, application
statement
no evaluate to value. 메모리를 변경한다. imperative 언어.
assignment, call, loop
int x = 1
은 evaluation이 아니라, 값을 assign하는 것으로 statement이다. (1 자체는 evaluation)
int y = x + 3
은 evaluation이 아니라, 값을 assign하는 것으로 statement이다.
(x+3 자체는 evaluation)
if (y>0)
는 expression이다.
y -= 4
는 statement다.
y += 4
는 statement다.
⇓E ⊆ Store × E × Value
⇒S ⊆ Store × S × Store
위 형태가 가능하도록 FVAE를 업데이트 시켜보자
boolean literal, conditional branch expression, less-than expression을 추가한다
기존 FVAE의 Value Domain = Z +D Closure
CFVAE의 Value Domain = Z +D Closure +D Bool
Bool = {true, false}
BOOL 룰이 추가되었다.
위는 기존과 동일하다.
LessThan, Cond 룰이 추가되었다.
LessThan expression
e1은 n1으로 평가되고 e2가 n2로 평가되면, e1 < e2는 n1 < n2로 평가된다.
Rule Cond case1
e1이 true로 평가되고 e2이 v로 평가되면 e1 ? e2 : e3은 v로 평가된다
Rule Cond case2
e1이 fasle로 평가되고 e3이 v로 평가되면 e1 ? e2 : e3은 v로 평가된다.
(1-1)<true
e2는 integer값이어야 하는데 logical value(bool)이므로 runtime error
if (1+0) then 0+7 else 3 endif
1+0은 integer 값인데 해당 자리는 logical value어야 하기 때문에 runtime error
우리가 만든 value domain을 simplify 할 수 있는가?! -> syntatic sugar로 가능하다!
true / false의 logical value를 사용하는 것 대신, integer value를 사용하면 된다.
parser을 업데이트하여 parser가 true를 1로, false를 0으로 인식하게 한다.
parse("true") = 1, parse("false") = 0
-> abstract syntax에서 boolean 값이 필요 없어진다.
boolean 값은 사라진다.
기존에는 e1이 1이어야 true로 평가되었다.
이 경우는 e1이 n으로 평가되고, n이 0이 아닐 경우에는 모두 10, 20 등등 모두 true로 평가되게 만든 것이다.
기존에는 1+2인 경우 runtime error가 발생했다.
이렇게 업데이트 한 이후에는, 7로 평가된다.
ocaml에서도 이렇게 bool 값을 삭제한다.