正確には、Gaucheの評価結果をScmEvalPacket?型の構造体で取ってきて、中身を拝借する。
もっと良い方法があるかもしれない
無駄注意
sample.c
#define GAUCHE_API_0_8_8 /* Scm_EvalCString(char*, ScmObj, ScmEvalPacket*)を使うため */ //#define GAUCHE_API_0_9 /* もしくは、これ */ #include <gauche.h> int main(int argc, char **argv) { GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); /* ScmEvalPacketは、評価結果を入れるための箱 */ ScmEvalPacket packet; Scm_EvalCString("(+ 1 1)", SCM_NIL, &packet); int num = packet.numResults; printf("num of results: %d\n", num); ScmObj result = packet.results[0]; /*OutputStringPortに渡して、また取ってくる*/ ScmObj os = Scm_MakeOutputStringPort(TRUE); Scm_Write(result, os, SCM_WRITE_DISPLAY); /*for GAUCHE_API_0_8_8*/ char *c = Scm_GetString(SCM_STRING(Scm_GetOutputString(SCM_PORT(os)))); /*for GAUCHE_API_0_9*/ //char *c = Scm_GetString(SCM_STRING(Scm_GetOutputString(SCM_PORT(os), 0))); puts(c); Scm_ClosePort(SCM_PORT(os)); Scm_Exit(0); return 0; }
see below
C言語からGaucheのライブラリを使う、はじめの一歩 on Dream Linux(Debian)
コンパイル
> gcc sample.c -I/usr/local/lib/gauche/0.8.14/include -lgauche
実行
> ./a.out num of results: 1 2
ScmEvalPacket?は、以下のような構造体で定義されている。
typedef struct ScmEvalPacketRec { ScmObj results[SCM_VM_MAX_VALUES]; int numResults; ScmObj exception; ScmModule *module; /* 'Current module' after evaluation */ } ScmEvalPacket;
GAUCHE_API_8_8以降では、
このパケット(のポインタ)をScm_EvalCStringに渡すと、Gauche内での評価結果を入れてくれるようだ。
ただし、それを使うためには、
#define GAUCHE_API_0_8_8 //or #define GAUCHE_API_0_9
としとかないといけない。
ScmEvalPacket?のなかで、今欲しいのは、resultsである。
resultsもScmObj?型であるため、
ScmObj result = packet.results[0];
として、一番目の要素を取り出した。 (ほんとは、取り出す前に配列の大きさを調べてエラーチェックをかけるべき)
実は、 これをすんなりと表示したかったんだが、
そうは問屋が卸さなかった
苦肉の策として、
OutputStringPort?に書き出して(Scm_Write)、読み出す(Scm_GetOutputString?)っていう手順を踏まないといけなかった。
ほんとは、もう少し良い方法があるのかもしれないが、
一応の希望は見えてきた。
gauche.h