# HG changeset patch # User anatofuz # Date 1612585419 -32400 # Node ID 0512c7f88417cb4134a44879f5cf4051b28cf7a4 # Parent 20bb97e54d33543164bca7eee94c45ceb0ecf646 add src diff -r 20bb97e54d33 -r 0512c7f88417 paper/chapter/04-interface.tex --- a/paper/chapter/04-interface.tex Sat Feb 06 12:39:12 2021 +0900 +++ b/paper/chapter/04-interface.tex Sat Feb 06 13:23:39 2021 +0900 @@ -221,10 +221,32 @@ Implementの宣言の構文では、 まず\texttt{\#impl}の後ろに実装したいIntefaceの名前を入れる。 続く\texttt{as}キーワードの後ろに、 Implementの型名を記述する。 宣言はgenerate\_stub.plが読み取り、 変換した後のCbCファイルからは該当する行が削除される。 -\lstinputlisting[label=src:implHeader, caption=Intefaceの実装をする際の宣言]{src/implHeader.h} +\lstinputlisting[label=src:implHeader, caption=DataGearの使用の宣言]{src/implHeader.h} + \section{内部データ構造に利用するDataGearの使用構文の導入} +InterfaceおよびImplmentで使うDataGearは、通常引数の形でCodeGearに入力される。 +これ以外で、CodeGearの内部でデータ構造の表現の為に利用されるDataGearが存在する。 +例えばSingleLinkedStackの実装では、Stackにいれる値の表現としてElementDataGearを使う。 +Elementは入力で受け取ったunion Data型を使って、CodeGer内部で作製している。 +\lstinputlisting[label=src:pushStackCbC, caption=CodeGear内部で作られるElement DataGear]{src/pushStack.cbc} + +意味的にはInterfaceとしてではなく、DataGearそのものを使いたいケースであるため\texttt{\#interface}構文以外の新しいDataGearの使用を宣言する構文を導入したい。 + +DataGearを明示的に使うことを宣言する構文として\texttt{\#data}を導入した。 +これは使用したいDataGearの定義ファイルを\texttt{\#data}の後ろに記述する。 +SingleLinkedStackの場合の例をソースコード\ref{src:implStackdef}に示す。 +この例ではNodeとElementを使用している。 +\lstinputlisting[label=src:implStackdef, caption=DataGearの使用の宣言]{src/implStackDef.cbc} + +この宣言は、使用しているDataGearを調査しcontext.hを作製するgenerate\_context.plが発見できなければならない。 +しかしgenerate\_context.plは、メタ情報を含む形にgenerate\_stub.plはトランスパイルした後に実行される。 +GearsOSで拡張したマクロの用なInterface関連の宣言はここで消されてしまう。 +DataGearの使用の宣言は、コメントの形で変換後のファイルに書き出すようにし、generate\_context.plでも参照可能にした。 +SingleLinkedStackの例題に対応する変換後のコードを、ソースコード\ref{src:implStackdefAfter}に示す。 +\lstinputlisting[label=src:implStackdefAfter, caption=DataGearの使用の宣言のPerlによる変換後]{src/IncludeNode.cbc} + \section{Interface APIに対応したCodeGearの名前の自動変換} \label{sec:autoCodeGearName} InterfaceのAPIに対応したCodeGearを実装する際、今までは暗黙にInterface名とImplの型名をつなげた名前で定義していた。 diff -r 20bb97e54d33 -r 0512c7f88417 paper/master_paper.pdf Binary file paper/master_paper.pdf has changed diff -r 20bb97e54d33 -r 0512c7f88417 paper/src/IncludeNode.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/IncludeNode.cbc Sat Feb 06 13:23:39 2021 +0900 @@ -0,0 +1,2 @@ +// include "Node.h" +// include "Element.h" diff -r 20bb97e54d33 -r 0512c7f88417 paper/src/implStackDef.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/implStackDef.cbc Sat Feb 06 13:23:39 2021 +0900 @@ -0,0 +1,3 @@ +#impl "Stack.h" as "SingleLinkedStack.h" +#data "Node.h" +#data "Element.h" diff -r 20bb97e54d33 -r 0512c7f88417 paper/src/pushStack.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/pushStack.cbc Sat Feb 06 13:23:39 2021 +0900 @@ -0,0 +1,7 @@ +__code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) { + Element* element = new Element(); + element->next = stack->top; + element->data = data; + stack->top = element; + goto next(...); +}