diff slide/slide.md @ 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
line wrap: on
line diff
--- 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);
 ```
 
 ## 並列処理の構成