Mercurial > hg > Document > Growi
comparison Gears/introduction/interface.md @ 2:b6c284fd5ae4
backup 2020-12-16
author | autobackup |
---|---|
date | Wed, 16 Dec 2020 15:11:16 +0900 |
parents | e12992dca4a0 |
children |
comparison
equal
deleted
inserted
replaced
1:145f69454ad5 | 2:b6c284fd5ae4 |
---|---|
3 - GearsOSにはモジュール化の仕組みとしてInterface構文が存在します | 3 - GearsOSにはモジュール化の仕組みとしてInterface構文が存在します |
4 - JavaやgolangのInterface, Haskellの型クラスに相当する構文です | 4 - JavaやgolangのInterface, Haskellの型クラスに相当する構文です |
5 | 5 |
6 ## Interfaceで定義するもの | 6 ## Interfaceで定義するもの |
7 - golangのInterfaceでは、関数の集合、及び関数の引数と返り値がinterfaceとして定義されていました | 7 - golangのInterfaceでは、関数の集合、及び関数の引数と返り値がinterfaceとして定義されていました |
8 - GearsOSのItnerfaceでも同様に、使用するデータ構造と、関数を記述します | |
9 - 使用するデータ(DataGear)はPerlスクリプト側の改良により、`__code`の中に定義しておけば問題ないようになった | |
10 | |
11 ## 書き方(~2019/02/03) | |
12 | |
13 ``` | |
14 typedef struct InterfaceName<Type, Impl>{ | |
15 //入出力で使用するデータ構造を記述する | |
16 union Data* stack; | |
17 union Data* data; | |
18 union Data* data1; | |
19 | |
20 // APIとして使用するCodeGearを列挙する | |
21 //ここで利用する引数|出力は必ず上で列挙する必要がある | |
22 __code whenEmpty(...); | |
23 __code clear(Impl* stack,__code next(...)); | |
24 __code get2(Impl* stack, __code next(Type* data, Type* data1, ...)); | |
25 | |
26 //継続先のCodeGear | |
27 __code next(...); | |
28 } InterfaceName; | |
29 ``` | |
30 - Type | |
31 - 自分自身の型 | |
32 - Impl | |
33 - 自分自身の実装の型 | |
34 - Stackの場合はSingleLinkedStackなど... | |
35 | |
36 ## 書き方(2019/02/03~) | |
37 | |
38 - Perl側を改良したので引数を別で定義する必要がなくなった | |
39 | |
40 ``` | |
41 typedef struct InterfaceName<Type, Impl>{ | |
42 // APIとして使用するCodeGearを列挙する | |
43 __code whenEmpty(...); | |
44 __code clear(Impl* stack,__code next(...)); | |
45 __code get2(Impl* stack, __code next(Type* data, Type* data1, ...)); | |
46 | |
47 //継続先のCodeGear | |
48 __code next(...); | |
49 } InterfaceName; | |
50 ``` | |
51 ## 仕様QA | |
52 `__code`の記述が始まる前に引数を宣言していた場合、宣言された引数のみが使われる。 | |
53 | |
54 (`__code`の中の引数はキャプチャされない) | |
55 | |
56 ## Interfaceのファイルを利用するスクリプト | |
57 - interfaceのファイルは次のPerlスクリプトで利用され、CbCレベルでは実は参照されません | |
58 - `trans_impl.pl` | |
59 - cbcファイルの雛形を生成する際に、実装しているファイルから動的に呼び出されます | |
60 - ` generate_stub.pl` | |
61 - ` generate_context.pl` | |
62 - 入出力の引数チェックで行われます | |
63 - `generate_context`では、 `context.h`を生成する際に読み込まれます | |
64 | |
65 ## CbCレベルでのInterface | |
66 - CbCレベルでは、 stub 及び, `context.h` の `union Data` の定義内で定義されています | |
67 - その為 `context.h` を `include`することで、これらの型を利用できます | |
68 | |
69 ## Interfaceの具体例 | |
70 - [Stack](/Gears/introduction/interface/Stack) | |
71 | |
72 ## Interfaceの実装の具体例 | |
73 - [SingleLinkedStack](/Gears/introduction/interface/impl/SingleLinkedStack) | |
74 | |
75 ## Q&A | |
76 | |
77 ### Q.「Interefaceに書いたDataGearはどうやって実装側から使うの?」 | |
78 | |
79 **A.「引数で与える」** | |
80 | |
81 ### Q.「引数で使ってないけどContextにDataGearを登録したい」 | |
82 | |
83 **A.「専用の構文があります」** | |
84 - `// data_gear "WantStruct.h"` と書いておくと `generate_context.pl`時に解決される | |
85 | |
86 #### 例 | |
87 | |
88 - 例えば `"DataGearExample`をcontextに加えたい場合 | |
89 - まず最初に対象のヘッダファイルをどこかに作っておく | |
90 - `struct DataGearExample`を使いたいCbCファイルに以下の記述を書いておく | |
91 | |
92 ```c | |
93 #include "hoge.h" | |
94 //data_gear "DataGearExample.h" | |
95 ``` | |
96 | |
97 - `#interface "hoge.h"`構文もあるが、 `generate_stub`の時点でこの文が消えるので、コメントで追加している | |
98 | |
99 ### Q.Intefaceに値持たせたいんだけど | |
100 | |
101 **A. 値は実装側に持たせるのでInterfaceには書いちゃだめ!!** | |
102 | |
103 - interfaceはあくまでもCodeGearの入出力だけのDataしかない | |
104 - 細かなDataはすべて実装に持たせる | |
105 - 同じfieldを持つ実装が複数存在する |