Next: , Previous: , Up: Gforth   [Contents][Index]


12 Integrating Gforth into C programs

C または C++ またはその他の言語で書かれているアプリケーションのスクリプト言語として Forth を使用することを好む人もいます。

Forth システム ATLAST は、 Forth システムをアプリケーションに組み込むための機能を提供します。 残念ながら、 これにはいくつかの欠点があります。 最も重要なのは、 標準 Forth に基づいておらず、 明らかに死んでいる(つまり、 これ以降開発されておらず、 サポートされていない)ことです。 この分野で Gforth が提供する機能は ATLAST の機能からインスピレーションを得ているため、 ATLAST からの切り替えは難しくはありません。

また、 著者達は、 いつか標準化されたインターフェイスに到達できるように、 他の Forth システムで簡単に実装できるようにインターフェイスを設計することも試みました。 このような標準インターフェイスを使用すると、 C 言語のコードを書き直すことなく他の Forth システムに置き換えることができます。

Gforth インタプリタを埋め込むには、 ライブラリ libgforth.a または libgforth.so とリンクします(コンパイラにオプション -lgforth を指定するか、 他のエンジンのいずれかの場合は -lgforth-fast または -lgforth-itc または -lgforth-ditc を指定します)。 このライブラリ内のインターフェイスに属するすべてのグローバル・シンボルには、 接頭辞 gforth_ が付いています。 共通のインターフェイスが出現した場合、 接頭辞 forth_ を付けた #define を通じて関数を利用できる可能性もあります。

#include <gforth.h> を使用して、 Forth 型の宣言と、 インターフェイス関数と、 変数をインクルードすることができます。

いまや、 あなたは gforth_main を呼び出すか、 以下のコンポーネントを使用して、 Gforth セッションを実行できるようになりました:

Cell gforth_main(int argc, char **argv, char **env)
{
  Cell retvalue=gforth_start(argc, argv);

  if(retvalue == -56) { /* throw-code for quit */
    retvalue = gforth_bootmessage();     // show boot message
    if(retvalue == -56)
      retvalue = gforth_quit(); // run quit loop
  }
  gforth_cleanup();
  gforth_printmetrics();
  // gforth_free_dict(); // if you want to restart, do this

  return retvalue;
}

Forth インタープリタと対話するには、 Xt gforth_find(Char * name)Cell gforth_execute(Xt xt) があります。

(未記述)(さらなるドキュメントをここに置く必要があります。)

12.1 Types

Cell, UCell: データ・スタック項目

Float: FPスタック項目

AddressXtLabel: メモリと、Forthワードと、VM内部のForth命令への、 ポインタ・タイプ。

12.2 Variables

データスタックポインタおよびFPスタックポインタ。 領域のサイズ。スタックへのアクセス

gforth_SP, gforth_FP.

12.3 Functions

void *gforth_engine(Xt *, stackpointers *);
Cell gforth_main(int argc, char **argv, char **env);
int gforth_args(int argc, char **argv, char **path, char **imagename);
ImageHeader* gforth_loader(char* imagename, char* path);
user_area* gforth_stacks(Cell dsize, Cell rsize, Cell fsize, Cell lsize);
void gforth_free_stacks(user_area* t);
void gforth_setstacks(user_area * t);
void gforth_free_dict();
Cell gforth_go(Xt* ip0);
Cell gforth_boot(int argc, char** argv, char* path);
void gforth_bootmessage();
Cell gforth_start(int argc, char ** argv);
Cell gforth_quit();
Xt gforth_find(Char * name);
Cell gforth_execute(Xt xt);
void gforth_cleanup();
void gforth_printmetrics();
void gforth_setwinch();

12.4 Signals

Gforth は、 例外とウィンドウ・サイズの変更をキャッチするためにシグナル・ハンドラーを設定します。 これにより、C言語プログラムが妨げられる可能性があります。


Next: Emacs and Gforth, Previous: Model, Up: Gforth   [Contents][Index]