# HG changeset patch # User mir3636 # Date 1524390758 -32400 # Node ID 0e42707ddeb2c67b38eae500914244d51a22d7e3 # Parent 6c55961dcf0ba7f3fd9fb07ae9045a18c8e0e82c add diff -r 6c55961dcf0b -r 0e42707ddeb2 Paper/sigos.pdf Binary file Paper/sigos.pdf has changed diff -r 6c55961dcf0b -r 0e42707ddeb2 Paper/sigos.tex --- a/Paper/sigos.tex Sun Apr 22 18:38:16 2018 +0900 +++ b/Paper/sigos.tex Sun Apr 22 18:52:38 2018 +0900 @@ -163,17 +163,11 @@ ノーマルレベルでは Context を直接見ることはできない。 Code Gear の継続は関数型プログラミングからみると継続先の Context を含む Closure となっている。 -これを記述するために継続に不定長引数を追加する構文をスクプリトの変換機能として用意した図。\ref{fig:varargnext} +これを記述するために継続に不定長引数を追加する構文をスクプリトの変換機能として用意した図。\ref{varargnext} メタ計算側ではこれらの Context を常に持ち歩いているので goto 文で引数を用いることはなく、 行き先は Code Gear の番号のみで指定される。 -\begin{figure}[ht] - \begin{center} -% \includegraphics[width=70mm]{./pic/MetaGear.pdf} - \end{center} - \caption{不定長引数を持つ継続} - \label{fig:varargnext} -\end{figure} +\lstinputlisting[label=varargnext, caption=不定長引数を持つ継続]{./src/varargnext.cbc} これにより Interface 間の呼び出しを C++ のメソッド呼び出しのように記述することができる。 Interface の実装は、Context 内に格納されているので、オブジェクトごとに実装を変える多様性を実現できている。 diff -r 6c55961dcf0b -r 0e42707ddeb2 Paper/src/varargnext.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/varargnext.cbc Sun Apr 22 18:52:38 2018 +0900 @@ -0,0 +1,9 @@ +__code popSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) { + if (stack->top) { + data = stack->top->data; + stack->top = stack->top->next; + } else { + data = NULL; + } + goto next(data, ...); +}