Mercurial > hg > Papers > 2018 > parusu-master
changeset 105:d14f18fef819
Fix
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 13 Feb 2018 14:13:42 +0900 |
parents | 4b49908418e2 |
children | 2d411c46eeb9 |
files | slide/slide.html slide/slide.md |
diffstat | 2 files changed, 42 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/slide.html Tue Feb 13 13:49:38 2018 +0900 +++ b/slide/slide.html Tue Feb 13 14:13:42 2018 +0900 @@ -87,7 +87,7 @@ <!-- === begin markdown block === generated by markdown/1.2.0 on Ruby 2.3.0 (2015-12-25) [x86_64-darwin16] - on 2018-02-13 13:24:35 +0900 with Markdown engine kramdown (1.13.2) + on 2018-02-13 14:13:38 +0900 with Markdown engine kramdown (1.13.2) using options {} --> @@ -329,9 +329,10 @@ <!-- _S9SLIDE_ --> <h2 id="interface--1">Interface の定義</h2> <ul> - <li><strong>__code next(…)</strong> は一種のクロージャであり、引数で Code Gear を渡すことが出来る</li> - <li>クロージャの引数には Input Data Gear を指定する</li> - <li>… は可変長引数のような扱いで、Code Gear が複数の Input Data Gear を待っている可能性がある</li> + <li><strong>__code next(…)</strong> は継続を表している</li> + <li>… は可変長引数に相当する</li> + <li>可変長引数部分には呼び出し元の Interface の Data Gear が入る</li> + <li>継続の引数で Output Data Gear を返すことが出来る</li> </ul> <pre lang="c"><code>typedef struct Queue<Impl>{ @@ -353,12 +354,11 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="interface--2">Interface の実装</h2> +<h2 id="interface--2">Interface のインスタンスの生成</h2> <ul> - <li>Interface には複数の実装を行うことが出来る</li> - <li>Code Gear の番号を Interface の定義に代入することで実装を行う</li> + <li>Interface は API に Code Gear を番号を入れることにより、複数の実装ヲ行うことが出来る</li> <li>代入する Code Gear を入れ替えることで別の実装を表現する</li> - <li>実装した Data Gear の生成は関数呼び出しで行われ、外から見るとInterface の型で扱われる</li> + <li>Interface を表す Data Gear の生成は以下の関数で行われる</li> </ul> <pre lang="c"><code>Queue* createSingleLinkedQueue(struct Context* context) { @@ -379,10 +379,10 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="interface--code-gear-">Interface を利用した Code Gear の呼び出し</h2> +<h2 id="interface--3">Interface の使い方</h2> <ul> <li>Interface を利用した Code Gear への継続は <code>goto interface->method</code> で行われる</li> - <li><strong>interface</strong> は Interfaceの型で包んだData Gear、 <strong>method</strong> は実装した Code Gear に対応する</li> + <li><strong>interface</strong> は Interface を表す Data Gear、 <strong>method</strong> は実装した Code Gear に対応する</li> </ul> <pre lang="c"><code>__code code1() { @@ -397,16 +397,20 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="interface--code-gear--1">Interface を利用した Code Gear の呼び出し(スクリプト変換後)</h2> +<h2 id="interface--4">メタレベルでの Interface の呼び出しの詳細</h2> <ul> - <li>Interface を利用した Code Gear の継続はスクリプトによって変換される + <li>Interface を利用した Code Gear の継続はスクリプトによってメタレベルの記述に変換される <ul> - <li>変換後は Context を参照するため、メタレベルの記述になる</li> + <li>変換後は Context を参照するコードが生成される</li> </ul> </li> <li>Gearef マクロは Context から Interface の引数格納用の Data Gear を取り出す</li> - <li>この Data Gear は Context を初期化した際に特別に生成され、型は Interface と同じになる</li> - <li>呼び出すCode Gear の引数情報に合わせて引数に格納し、 実装された Code Gear へ継続する</li> + <li>Context には Interface の引数を渡すための Data Gear が予め用意されている</li> + <li>goto meta では Interface の Code Gear の番号を Code Gear へのポインタに変換して継続を行う + <ul> + <li>goto meta にはメタ計算をいれることができる</li> + </ul> + </li> </ul> <pre lang="c"><code>__code code1(struct Context *context) { @@ -443,6 +447,10 @@ enum Code next = Gearef(context, Queue)->next; goto putSingleLinkedQueue(context, queue, data, next); } + +__code meta(struct Context* context, enum Code next) { + // printf("meta %d\n",next); + goto (context->code[next])(context); </code></pre>
--- a/slide/slide.md Tue Feb 13 13:49:38 2018 +0900 +++ b/slide/slide.md Tue Feb 13 14:13:42 2018 +0900 @@ -141,9 +141,10 @@ ``` ## Interface の定義 -- **__code next(...)** は一種のクロージャであり、引数で Code Gear を渡すことが出来る -- クロージャの引数には Input Data Gear を指定する -- ... は可変長引数のような扱いで、Code Gear が複数の Input Data Gear を待っている可能性がある +- **__code next(...)** は継続を表している +- ... は可変長引数に相当する +- 可変長引数部分には呼び出し元の Interface の Data Gear が入る +- 継続の引数で Output Data Gear を返すことが出来る ``` c typedef struct Queue<Impl>{ @@ -161,11 +162,10 @@ } Queue; ``` -## Interface の実装 -- Interface には複数の実装を行うことが出来る -- Code Gear の番号を Interface の定義に代入することで実装を行う +## Interface のインスタンスの生成 +- Interface は API に Code Gear を番号を入れることにより、複数の実装ヲ行うことが出来る - 代入する Code Gear を入れ替えることで別の実装を表現する -- 実装した Data Gear の生成は関数呼び出しで行われ、外から見るとInterface の型で扱われる +- Interface を表す Data Gear の生成は以下の関数で行われる ``` c Queue* createSingleLinkedQueue(struct Context* context) { @@ -182,9 +182,9 @@ } ``` -## Interface を利用した Code Gear の呼び出し +## Interface の使い方 - Interface を利用した Code Gear への継続は `goto interface->method` で行われる -- **interface** は Interfaceの型で包んだData Gear、 **method** は実装した Code Gear に対応する +- **interface** は Interface を表す Data Gear、 **method** は実装した Code Gear に対応する ``` c __code code1() { @@ -195,12 +195,13 @@ } ``` -## Interface を利用した Code Gear の呼び出し(スクリプト変換後) -- Interface を利用した Code Gear の継続はスクリプトによって変換される - - 変換後は Context を参照するため、メタレベルの記述になる +## メタレベルでの Interface の呼び出しの詳細 +- Interface を利用した Code Gear の継続はスクリプトによってメタレベルの記述に変換される + - 変換後は Context を参照するコードが生成される - Gearef マクロは Context から Interface の引数格納用の Data Gear を取り出す -- この Data Gear は Context を初期化した際に特別に生成され、型は Interface と同じになる -- 呼び出すCode Gear の引数情報に合わせて引数に格納し、 実装された Code Gear へ継続する +- Context には Interface の引数を渡すための Data Gear が予め用意されている +- goto meta では Interface の Code Gear の番号を Code Gear へのポインタに変換して継続を行う + - goto meta にはメタ計算をいれることができる ``` c __code code1(struct Context *context) { @@ -232,6 +233,10 @@ enum Code next = Gearef(context, Queue)->next; goto putSingleLinkedQueue(context, queue, data, next); } + +__code meta(struct Context* context, enum Code next) { + // printf("meta %d\n",next); + goto (context->code[next])(context); ``` ## 並列処理の構成