#
CodeGear
Gearsで使用される基本的な処理のまとまり。
CbCの__code
のこと
#
宣言
1
|
__code cg_name(struct hoge* foo)
|
#
Interface
Gearsでのモジュール化の仕組み。JavaのInterface, Haskellの型クラスに相当する。
InterfaceはAPIの定義になっており、満たすべきCodeGearと入力を記述する。
#
記述
#
今現在
1
2
3
4
5
6
|
typedef struct IO <Type, Impl> {
__code read(Impl* io, struct file* file, char* addr, int n, __code next(...));
__code write(Impl* io, struct file* file, char* addr, int n, __code next(...));
__code close(Impl* io, struct file* file, int fd, __code next(...));
__code next(...);
} IO;
|
#
案1
- 先頭に
interface
と書き、<>
の中に利用したいデータ型を書く
- Typeは自分自身の型, Implは実装の型になる
1
2
3
4
5
6
|
interface IO <Type, Impl> {
__code read(Impl* io, struct file* file, char* addr, int n, __code next(...));
__code write(Impl* io, struct file* file, char* addr, int n, __code next(...));
__code close(Impl* io, struct file* file, int fd, __code next(...));
__code next(...);
};
|
#
CbCレベルでの表現
Interfaceは構造体に変換される。
変換される構造体は次のfieldを持つ。
- 実装へのポインタ
- 定義したCodeGearの名前に対応したenum Code
- CodeGearの引数
上のIOの場合は次のような構造体に変換される。
1
2
3
4
5
6
7
8
9
10
11
|
struct IO {
union Data* io;
struct file* file;
char* addr;
int n;
int fd;
enum Code read;
enum Code write;
enum Code close;
enum Code next;
} IO;
|
#
Interfaceの実装
宣言したInterfaceは実装を持つ事ができる。
#
Interfaceを使うCodeGearの宣言
1
2
3
|
__code test_code1(IO *io, char* args, __code next(...)) {
goto io->write(args, next);
}
|