Mercurial > hg > Papers > 2017 > atton-master
changeset 60:ecd3a1e40921
Add normal level goto
author | atton <atton@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 01 Feb 2017 15:37:11 +0900 |
parents | 5450e7ae5fa5 |
children | 3981580ece72 |
files | paper/cbc-type.tex paper/src/Goto.agda |
diffstat | 2 files changed, 30 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/cbc-type.tex Wed Feb 01 15:27:15 2017 +0900 +++ b/paper/cbc-type.tex Wed Feb 01 15:37:11 2017 +0900 @@ -55,7 +55,33 @@ 正しく計算が行なえたなら値150が得られるはずである。 % }}} +% {{{ ノーマルレベル計算の実行 \section{ノーマルレベル計算の実行} +プログラムを実行することは \verb/goto/ を定義することと同義である。 +軽量継続\verb/goto/ の性質としては + +\begin{itemize} + \item 次に実行する CodeSegment を指定する + \item CodeSegment に渡すべき DataSegment を指定する + \item 現在実行している CodeSegment から制御を指定されて CodeSegment へと移動させる +\end{itemize} + +がある。 +Agda における CodeSegment の本体は関数である。 +関数をそのまま使用すると再帰を許してしまうために CbC との対応が失われてしまう。 +よって、\verb/goto/を利用できるのは関数の末尾のみである、という制約を関数に付け加える必要がある。 + +この制約さえ満たせば、CodeSegment の実行は CodeSegment 型から関数本体を取り出し、レコード型を持つ値を適用することに相当する。 +具体的に \verb/goto/ を関数として適用するとリスト~\ref{src:agda-goto}のようになる。 + +\lstinputlisting[label=src:agda-goto, caption=Agdaにおける goto の定義] {src/Goto.agda} + +この \verb/goto/ の定義を用いることで main などの関数が評価できるようになり、値150が得られる。 +本文中での CodeSegment の定義は一部を抜粋している。 +実行可能な Agda のソースコードは付録に載せる。% TODO: Appendix + +% }}} + \section{MetaDataSegment の定義} \section{MetaCodeSegment の定義} \section{メタレベル計算の実行}