18

i.e. is it possible to embed Haskell code in a C library so that the user of the library doesn't have to know Haskell is being used? In particular, so that the user could use multiple libraries that embed Haskell, without any conflicts?

As far as I understand things, you embed between calls to hs_init and hs_exit, but these involve global state shenanigans and should conflict with other calls, no?

4

1 に答える 1

14

はい、 FFI( Foreign Function Interface)を介してCから(およびその逆に)Haskellコードを呼び出すことができます。残念ながら、haskell.orgのドキュメントにあるように、haskell環境を初期化およびファイナライズするための呼び出しを回避することはできません。

hs_init()を呼び出すと、GHCのランタイムシステムが初期化されます。hs_init()を呼び出す前にHaskell関数を呼び出そうとしないでください。間違いなく悪いことが起こります。

しかし、これも興味深いです:

hs_init()への呼び出しは複数存在する可能性がありますが、それぞれがhs_exit()への1回の(そして1回のみの)呼び出しと一致する必要があります。

そしてさらに

FFI仕様では、hs_exit()でシャットダウンされた後、それ自体の再初期化をサポートする実装が必要ですが、GHCは現在それをサポートしていません。

基本的に私の考えは、この仕様を利用して、たとえば、囲まれたテンプレートメソッドを使用して呼び出しを管理するラッパーC ++クラスをhs_init作成hs_exiths_iniths_exit必要なhaskell呼び出しを使用してオーバーライドできるようにすることです。ただし、haskellコードを呼び出す他のライブラリとの相互作用に注意してください:呼び出しのネストされたレイヤーはOKhs_iniths_exitある必要があります(したがって、ラッパー間でそれらを呼び出すライブラリを使用しても安全です)が、呼び出しの総数は常に一致する必要があります。これらのライブラリは、環境を閉じようとせずに初期化するだけです。その後、ジョブを終了するのはあなた次第です。

継承やオーバーライドを利用せずに、別の(おそらくより良い)アイデアは、コンストラクターとデストラクターHaskellEnvを呼び出す単純なクラスを持つことかもしれません。それらを自動変数として宣言すると、への呼び出しとが常に一致することがわかります。スコープを離れると、最新のオブジェクトが破棄されるとすぐに、への最新の呼び出しが行われます。ヒープ上にオブジェクトが作成されないようにするために、この質問を確認してください(この場合は危険な場合があります)。hs_iniths_exiths_iniths_exiths_exitHaskellEnv

于 2012-06-21T11:49:33.410 に答える