場合によっては、 C言語の関数へ関数のポインターを渡す必要があります。 つまり、
ライブラリーがアプリケーションにコールバックしたい場合です(ポイント先の関数はコールバック関数と呼ばれます)。
既存のC言語の関数のアドレス(lib-sym
で取得。 see Low-Level C Interface Words)を渡すことができますが、 適切な C言語の関数がない場合、 あなたは Forth ワードをC言語の関数として定義したい筈です。 その際は、
下記にて説明する、 コールバックを生成する必要があります:
c-callback
を使用して Forth コードからC言語のコールバックを生成できます。
c-callback
( "forth-name" "{type}" "–" "type" – ) gforth-1.0 “c-callback”
指定のシグネチャ forth-name を使用してコールバック・インスタンス化器(instantiator;インスタンシエーター)を定義します。
コールバック・インスタンス化器 forth-name ( xt -- addr )
は、 xt を受け取り、
そのコールバックを処理する C言語関数の addr を返します。
c-callback-thread
( "forth-name" "{type}" "–" "type" – ) gforth-1.0 “c-callback-thread”
指定のシグネチャ forth-name を使用してコールバック・インスタンス化器を定義します。 コールバック・インスタンス化器
forth-name ( xt -- addr )
は、 xt を受け取り、 そのコールバックを処理する
C言語の関数の addr を返します。 このコールバックは、 別のスレッドから呼び出された場合に安全です
これにより、 (value callback#
までの)多数のコールバック関数がプリコンパイルされます。 C言語の関数プロトタイプは、
Forth シグネチャから推定されます。 これでは不十分な場合は、 Forth 型の後に波括弧({})で囲んで型を追加できます。
c-callback vector4double: f f f f -- void c-callback vector4single: f{float} f{float} f{float} f{float} -- void