はい、 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_exit
しhs_init
、hs_exit
必要なhaskell呼び出しを使用してオーバーライドできるようにすることです。ただし、haskellコードを呼び出す他のライブラリとの相互作用に注意してください:呼び出しのネストされたレイヤーはOKhs_init
でhs_exit
ある必要があります(したがって、ラッパー間でそれらを呼び出すライブラリを使用しても安全です)が、呼び出しの総数は常に一致する必要があります。これらのライブラリは、環境を閉じようとせずに初期化するだけです。その後、ジョブを終了するのはあなた次第です。
継承やオーバーライドを利用せずに、別の(おそらくより良い)アイデアは、コンストラクターとデストラクターHaskellEnv
を呼び出す単純なクラスを持つことかもしれません。それらを自動変数として宣言すると、への呼び出しとが常に一致することがわかります。スコープを離れると、最新のオブジェクトが破棄されるとすぐに、への最新の呼び出しが行われます。ヒープ上にオブジェクトが作成されないようにするために、この質問を確認してください(この場合は危険な場合があります)。hs_init
hs_exit
hs_init
hs_exit
hs_exit
HaskellEnv