# HG changeset patch # User Tatsuki IHA # Date 1518498822 -32400 # Node ID d14f18fef8194e0243e3abf3f3726a6598f9c802 # Parent 4b49908418e28446265ee93294e83149797a2c46 Fix diff -r 4b49908418e2 -r d14f18fef819 slide/slide.html --- 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 @@ @@ -329,9 +329,10 @@

Interface の定義

typedef struct Queue<Impl>{
@@ -353,12 +354,11 @@
 
 
-

Interface の実装

+

Interface のインスタンスの生成

    -
  • Interface には複数の実装を行うことが出来る
  • -
  • Code Gear の番号を Interface の定義に代入することで実装を行う
  • +
  • Interface は API に Code Gear を番号を入れることにより、複数の実装ヲ行うことが出来る
  • 代入する Code Gear を入れ替えることで別の実装を表現する
  • -
  • 実装した Data Gear の生成は関数呼び出しで行われ、外から見るとInterface の型で扱われる
  • +
  • Interface を表す Data Gear の生成は以下の関数で行われる
Queue* createSingleLinkedQueue(struct Context* context) {
@@ -379,10 +379,10 @@
 
-

Interface を利用した Code Gear の呼び出し

+

Interface の使い方

  • Interface を利用した Code Gear への継続は goto interface->method で行われる
  • -
  • interface は Interfaceの型で包んだData Gear、 method は実装した Code Gear に対応する
  • +
  • interface は Interface を表す Data Gear、 method は実装した Code Gear に対応する
__code code1() { 
@@ -397,16 +397,20 @@
 
-

Interface を利用した Code Gear の呼び出し(スクリプト変換後)

+

メタレベルでの Interface の呼び出しの詳細

    -
  • Interface を利用した Code Gear の継続はスクリプトによって変換される +
  • Interface を利用した Code Gear の継続はスクリプトによってメタレベルの記述に変換される
      -
    • 変換後は Context を参照するため、メタレベルの記述になる
    • +
    • 変換後は 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 にはメタ計算をいれることができる
    • +
    +
__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);
 
diff -r 4b49908418e2 -r d14f18fef819 slide/slide.md --- 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{ @@ -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); ``` ## 並列処理の構成