6

私は、Scheme の C++ 実装であるYpsilonをいじり始めました。

R6RSに準拠し、高速なガベージ コレクターを備え、マルチコア CPU と Unicode をサポートしていますが、ドキュメント、C++ コード例、およびコード内のコメントが不足しています。

作成者は、これをスタンドアロンのコンソール アプリケーションとして提供します。私の目標は、画像処理アプリケーションのスクリプト エンジンとして使用することです。

ソース コードはよく構造化されていますが、構造がよくわかりません。私は 2 週間かけて侵入し、次のことを発見しました。

  1. 外界とのすべての通信は、ポートと呼ばれる C++ 構造体を介して行われます。これらは、Scheme ポートに対応しています。
  2. 仮想マシンには、IN、OUT、および ERROR の 3 つのポートがあります。
  3. ポートは、std-ports (コンソール経由)、socket-ports、bytevector-ports、named-file-ports、custom-ports のいずれかです。
  4. 各カスタム ポートは、handlersと呼ばれる塗りつぶされた構造を提供する必要があります。
  5. Handlersは 6 つの要素を含むベクトルです。最初の 1 つはブール値 (ポートがテキストかどうか)、残りの 5 つは関数ポインター (onRead、onWrite、onSetPos、onGetPos、onClose) です。

私の知る限り、3 つのカスタム ポート (IN、OUT、および ERROR) を実装する必要があります。しかし、今のところ、 handlersの各関数 (onRead、onWrite、onSetPos、onGetPos、onClose) の入力パラメーターは何なのかわかりません。

残念ながら、カスタムポートを実装する例も、次の例もありません。

  1. C++ から Scheme 関数へのバインディング (提供される例は多数の .scm ファイルですが、C++ 側で何をすべきかはまだ不明です)。
  2. バイトコードのコンパイルと実行 (bytevector-ports 経由?しかし、テキストをバイトコードにコンパイルする方法?)。

要約すると、誰かが上記のシナリオの C++ の例を提供してくれれば、時間を大幅に節約できます。前もって感謝します!

4

2 に答える 2

3

さて、私がソースコードを読むことができることから、さまざまなハンドラーがどのように呼び出されるかを次に示します(これはすべて非公式であり、純粋にソースコードの検査に基づいています)。

  1. 読み取りハンドラー::(lambda (bv off len))バイトベクトル(ハンドラーが読み取りデータを入れる)、オフセット(fixnum)、および長さ(fixnum)を取ります。最大バイトを読み込み、lenそれらのバイトをbvで始まるように配置する必要がありますoff。実際に読み込まれたバイト数を(fixnumとして)返します。
  2. 書き込みハンドラー::(lambda (bv off len))バイトベクトル(書き込むデータを含む)、オフセット(fixnum)、および長さ(fixnum)を取ります。から最大lenバイトを取得しbvoffそれらを書き出します。実際に書き込まれたバイト数を(fixnumとして)返します。
  3. 位置ハンドラーの取得:((lambda (pos))テキストモードでのみ呼び出されます):pos同じ値で設定された位置ハンドラーを後で呼び出すと、pos位置が現在の位置にリセットされるように、データを保存できます。戻り値は無視されます。
  4. 位置ハンドラーの設定::(lambda (pos))現在の位置をの値に移動しますpos。戻り値は無視されます。
  5. ハンドラー(lambda ())を閉じる::ポートを閉じます。戻り値は無視されます。
于 2013-02-19T20:29:07.793 に答える
3

「バイトコード」のコンパイルと実行についての別の質問に答えるには、次のようにします。

  1. 式をコンパイルするには、を使用しますcompile。これはコードオブジェクトを返します。
  2. このコードオブジェクトを実行するための公的にエクスポートされたアプローチはありません。内部的には、コードはを使用してrun-vmiいますが、外部コードからこれにアクセスすることはできません。
  3. 内部的には、コンパイルされたコードがロードされて使用される唯一の場所は、そのauto-compile-cacheシステム内です。

詳細はこちらをご覧くださいheap/boot/eval.scm。(繰り返しになりますが、これは公式の回答ではありませんが、純粋に個人的な実験とソースコードの検査に基づいています。)

于 2013-02-19T21:21:41.737 に答える