Do more with "let"
"let"에 기능 추가하기
HNU CE 프로그래밍언어론 (2021년 1학기)
let식
\begin{array}{l}
e ::= x \mid n \mid b
\mid e + e
\mid e \land e \mid \neg e
\mid e = e \mid e \lt e
\\~\quad~~
\mid \texttt{if}\;e\;\texttt{then}\;e\;\texttt{else}\;e\; \mid \texttt{let}\;x=e\;\texttt{in}\;e\;
\end{array}
Semantics
~\sigma,e \Downarrow v~
v \in \texttt{Value} \;=\; \texttt{Int} \uplus \texttt{Bool}
e \in \texttt{Expr} \quad n\in\texttt{Int} \quad b\in\texttt{Bool}
Syntax
\displaystyle\frac{\sigma,\,e\,\Downarrow\,v \quad [x\mapsto v]\sigma,\,e_1\,\Downarrow\,v_1 }{
\sigma,\,\texttt{let}\;x=e\;\texttt{in}\;e_1 \;\Downarrow\; v_1}
\sigma' = [x\mapsto v]\sigma
\begin{array}{l}
\sigma'(x) = v \\
\sigma'(y) = \sigma(y) \quad (y\neq x)
\end{array}
함수 의미규칙
\begin{array}{l}
e ::= x \mid n \mid b
\mid e + e
\mid e \land e \mid \neg e
\mid e = e \mid e \lt e
\\~\quad~~
\mid \texttt{if}\;e\;\texttt{then}\;e\;\texttt{else}\;e\; \mid \texttt{let}\;x=e\;\texttt{in}\;e\;
\\~\quad~~
\mid \lambda x.e \mid e~e
\end{array}
Semantics
~\sigma,e \Downarrow v~
v \in \texttt{Value} \,=\, \texttt{Int} \uplus \texttt{Bool} \uplus \texttt{Clos}
e \in \texttt{Expr} \quad n\in\texttt{Int} \quad b\in\texttt{Bool}
Syntax
\texttt{Env} = \texttt{Name}\xrightarrow{_\textrm{fin}}\texttt{Value}
\frac{}{\sigma,\,\lambda x.e ~~\Downarrow~~ \langle\sigma,\lambda x.e\rangle}
\frac{ \sigma,\,e_1\,\Downarrow\,\langle\sigma_1,\lambda x.e\rangle
\quad \sigma,\,e_2\,\Downarrow\,v_2
\quad [x\mapsto v_2]\sigma_1,\,e\,\Downarrow\,v}{
\sigma,\,e_1\;e_2 ~\Downarrow~ v}
\langle \sigma, \lambda x.e \rangle \in \texttt{Clos} ~ \subset ~ \texttt{Env} \times \texttt{Expr}
클로저(closure)
let을 좀더 편하게 만들어 보자
- let으로 한번에 여러 개 이름 정의
- 재귀함수 정의도 let의 기능으로 추가
- 위의 두 가지 기능을 합쳐 상호재귀도 가능하도록
let x1 = 1 in
let x2 = 2 + x1 in
let x3 = 3 + x2 + x1 in
x1 + x2 + x3
let x1 = 1 ;
x2 = 2 + x1 ;
x3 = 3 + x2 + x1 in
x1 + x2 + x3
한번에 여러 개
let 한번에 여러 개
\begin{array}{l}
e ::= x \mid n \mid b
\mid e + e
\mid e \land e \mid \neg e
\mid e = e \mid e \lt e
\\~\quad~~
\mid \texttt{if}\;e\;\texttt{then}\;e\;\texttt{else}\;e\; \mid \texttt{let}\;x_1=e_1;\,\cdots;x_k=e_k\;\texttt{in}\;e\;
\\~\quad~~
\mid \lambda x.e \mid e~e
\end{array}
Semantics
~\sigma,e \Downarrow v~
e \in \texttt{Expr} \quad n\in\texttt{Int} \quad b\in\texttt{Bool}
Syntax
\displaystyle\frac{\sigma,\,e_1\,\Downarrow\,v_1 \quad [x_1\mapsto v_1]\sigma,\,e\,\Downarrow\,v }{
\sigma,\,\texttt{let}\;x_1=e_1\;\texttt{in}\;e \;\Downarrow\; v}
\displaystyle\frac{\sigma,\,e_1\,\Downarrow\,v_1 \quad [x_1\mapsto v_1]\sigma,\,\texttt{let}\;x_2=e_2;\cdots;x_k=e_k\;\texttt{in}\;e\,\Downarrow\,v }{
\sigma,\,\texttt{let}\;x_1=e_1;\,x_2=e_2;\cdots;x_k=e_k\;\texttt{in}\;e \;\Downarrow\; v}
let sum_upto = \x. if x < 1
then 0
else x + sum_upto (x + (-1))
in
sum_upto 10
재귀함수
귀찮게 매번 fixpoint 컴비네이터 쓰지 않고도
\begin{array}{l}
e ::= x \mid n \mid b
\mid e + e
\mid e \land e \mid \neg e
\mid e = e \mid e \lt e
\\~\quad~~
\mid \texttt{if}\;e\;\texttt{then}\;e\;\texttt{else}\;e\; \mid \texttt{let}\;x=e\;\texttt{in}\;e\;
\\~\quad~~
\mid \lambda x.e \mid e~e
\end{array}
Semantics
~\sigma,e \Downarrow v~
e \in \texttt{Expr} \quad n\in\texttt{Int} \quad b\in\texttt{Bool}
Syntax
\displaystyle\frac{\sigma,\,e_1\,\Downarrow\,v_1 \quad [x_1\mapsto v_1]\sigma,\,e\,\Downarrow\,v }{
\sigma,\,\texttt{let}\;x_1=e_1\;\texttt{in}\;e \;\Downarrow\; v} \quad (v_1\notin \texttt{Clos})
재귀함수
v \in \texttt{Value} \,=\, \texttt{Int} \uplus \texttt{Bool} \uplus \texttt{Clos}
\displaystyle\frac{
\sigma,\,e_1\,\Downarrow\,\langle\sigma_1,\lambda x.e_1'\rangle \quad
[x_1\mapsto\langle\sigma_1,\lambda x.\texttt{let}\;x_1=\lambda x.e_1'\;\texttt{in}\;e_1'\rangle]\sigma,\,e\,\Downarrow\,v }{
\sigma,\,\texttt{let}\;x_1=e_1\;\texttt{in}\;e \;\Downarrow\; v}
\begin{array}{l}
e ::= x \mid n \mid b
\mid e + e
\mid e \land e \mid \neg e
\mid e = e \mid e \lt e
\\~\quad~~
\mid \texttt{if}\;e\;\texttt{then}\;e\;\texttt{else}\;e\; \mid \texttt{let}\;x=e\;\texttt{in}\;e\;
\\~\quad~~
\mid \lambda x.e \mid e~e
\end{array}
Semantics
~\sigma,e \Downarrow v~
e \in \texttt{Expr} \quad n\in\texttt{Int} \quad b\in\texttt{Bool}
Syntax
\displaystyle\frac{\sigma,\,e_1\,\Downarrow\,v_1 \quad [x_1\mapsto v_1]\sigma,\,e\,\Downarrow\,v }{
\sigma,\,\texttt{let}\;x_1=e_1\;\texttt{in}\;e \;\Downarrow\; v} \quad (v_1\notin \texttt{Clos})
재귀함수
v \in \texttt{Value} \,=\, \texttt{Int} \uplus \texttt{Bool} \uplus \texttt{Clos}
\displaystyle\frac{
\sigma,\,e_1\,\Downarrow\,v_1 \quad
[x_1\mapsto\langle[x_1\mapsto v_1]\sigma_1,\lambda x.e_1'\rangle]\sigma,\,e\,\Downarrow\,v }{
\sigma,\,\texttt{let}\;x_1=e_1\;\texttt{in}\;e \;\Downarrow\; v} \quad (v_1 = \langle\sigma_1,\lambda x.e_1'\rangle )
let even = \x. if x=0 then true else odd (x + -1)
; odd = \x. if x=1 then true else even (x + -1)
in
even 10
상호재귀
같은 let안에서 정의된 이름이면
순서에 관계없이 서로 불러 쓸 수 있도록
DoMoreWithLet
By 안기영 (Ahn, Ki Yung)
DoMoreWithLet
HNU CE 프로그래밍언어론 (2021년 1학기)
- 948