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을 좀더 편하게 만들어 보자

  1. let으로 한번에 여러 개 이름 정의
  2. 재귀함수 정의도 let의 기능으로 추가
  3. 위의 두 가지 기능을 합쳐 상호재귀도 가능하도록
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학기)

  • 773