アットウィキロゴ

TinySchemeの外部関数の作り方(Windows用)

Cで外部関数を定義できます。
DLLを使って動的に拡張する仕組みも用意されています。

DLLの読み込みかた

(load-extension <拡張子無しのファイル名>)

DLLの構造


init_<拡張子無しのファイル名>()関数が必要です。
load-extensionしたときに最初にコールされます。

foo.dllだったらinit_foo()

外部関数の定義もここでやります。

外部関数の構造


引数


戻り値



インターフェース関数

"scheme"構造体内に定義されていて外部関数が使うことができる。
ドキュメントでは
As of v.1.17, the canonical way for a foreign function in a DLL to
manipulate Scheme data is using the function pointers in sc->interface.
のように書いてあってサンプルのコードにも
sc->interface->mk_symbol(sc,"square")
のように書いてあるが実際には
sc->vptr->mk_symbol(sc,"square")
のようになっている。

 void (*scheme_define)(scheme *sc, pointer env, pointer symbol, pointer value);
 pointer (*cons)(scheme *sc, pointer a, pointer b);
 pointer (*immutable_cons)(scheme *sc, pointer a, pointer b);
 pointer (*reserve_cells)(scheme *sc, int n);
 pointer (*mk_integer)(scheme *sc, long num);
 pointer (*mk_real)(scheme *sc, double num);
 pointer (*mk_symbol)(scheme *sc, const char *name);
 pointer (*gensym)(scheme *sc);
 pointer (*mk_string)(scheme *sc, const char *str);
 pointer (*mk_counted_string)(scheme *sc, const char *str, int len);
 pointer (*mk_character)(scheme *sc, int c);
 pointer (*mk_vector)(scheme *sc, int len);
 pointer (*mk_foreign_func)(scheme *sc, foreign_func f);
 void (*putstr)(scheme *sc, const char *s);
 void (*putcharacter)(scheme *sc, int c);
 
 int (*is_string)(pointer p);
 char *(*string_value)(pointer p);
 int (*is_number)(pointer p);
 num (*nvalue)(pointer p);
 long (*ivalue)(pointer p);
 double (*rvalue)(pointer p);
 int (*is_integer)(pointer p);
 int (*is_real)(pointer p);
 int (*is_character)(pointer p);
 long (*charvalue)(pointer p);
 int (*is_vector)(pointer p);
 long (*vector_length)(pointer vec);
 void (*fill_vector)(pointer vec, pointer elem);
 pointer (*vector_elem)(pointer vec, int ielem);
 pointer (*set_vector_elem)(pointer vec, int ielem, pointer newel);
 int (*is_port)(pointer p);
 
 int (*is_pair)(pointer p);
 pointer (*pair_car)(pointer p);
 pointer (*pair_cdr)(pointer p);
 pointer (*set_car)(pointer p, pointer q);
 pointer (*set_cdr)(pointer p, pointer q);

 int (*is_symbol)(pointer p);
 char *(*symname)(pointer p);
 
 int (*is_syntax)(pointer p);
 int (*is_proc)(pointer p);
 int (*is_foreign)(pointer p);
 char *(*syntaxname)(pointer p);
 int (*is_closure)(pointer p);
 int (*is_macro)(pointer p);
 pointer (*closure_code)(pointer p);
 pointer (*closure_env)(pointer p);

 int (*is_continuation)(pointer p);
 int (*is_promise)(pointer p);
 int (*is_environment)(pointer p);
 int (*is_immutable)(pointer p);
 void (*setimmutable)(pointer p);
 void (*load_file)(scheme *sc, FILE *fin);
 void (*load_string)(scheme *sc, const char *input);












最終更新:2008年05月31日 23:22