rubyもHaskellもFFIに対応しているので、
- Ruby から Haskell コードを呼び出すことは可能ですか?
- Ruby に Haskell バインディングはありますか?
GHC 6.12.1 は、Linux での動的ライブラリの構築をサポートしています。次のようなものを試してください:
{-# LANGUAGE ForeignFunctionInterface #-}
module Example where
import Foreign.C.Types
fibonacci :: Int -> Int
fibonacci n = fibs !! n
where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
fibonacci_hs :: CInt -> CInt
fibonacci_hs = fromIntegral . fibonacci . fromIntegral
foreign export ccall fibonacci_hs :: CInt -> CInt
#include <stdlib.h>
#include "HsFFI.h"
void
example_init (void)
{
hs_init (NULL, NULL);
}
void
example_exit (void)
{
hs_exit ();
}
require 'dl'
require 'dl/import'
module Example
extend DL::Importable
dlload "./libffi-example.so"
extern "void example_init()"
extern "void example_exit()"
extern "int fibonacci_hs(int)"
end
Example.example_init
1.upto( 40 ) do | x |
puts "#{ x } -> #{ Example.fibonacci_hs x }\n"
end
Example.example_exit
GHC=ghc-6.12.1
libffi-example.so: Example.o wrapper.o Example_stub.o
$(GHC) -o $@ -shared -dynamic -fPIC $^ -lHSrts-ghc6.12.1
Example_stub.c Example_stub.h Example.o: Example.hs
$(GHC) -c -dynamic -fPIC Example.hs
Example_stub.o: Example_stub.c
$(GHC) -c -dynamic -fPIC Example_stub.c
wrapper.o: wrapper.c Example_stub.h
$(GHC) -c -dynamic -fPIC wrapper.c
clean:
rm -f *.hi *.o *_stub.[ch] *.so
make
ruby script.rb
以前にそれが行われたのを見たことがありませんが、可能です。
libruby
ます。ruby_init()
Ruby インタープリターをインプロセスで実行するために、メインの実行可能ファイルは Haskell で記述され、関連する関数が呼び出されます。ただし、これにより、任意の Ruby コードを実行できます。hs_init()
にのみアクセスできます。foreign export
これら 2 つのオプションのいずれかを機能させるには、グルー コード (一部は C) を記述する必要があります。
あなたの要件が何であるかはわかりませんが、これは私が望むものです-それははるかに簡単です.
Haskell 側についてはよくわかりませんが、Mountain West Ruby Conf 09 のクールなビデオで、Ruby から FFI を操作する方法について説明しています。かなりいいインターフェースに見えます。
http://mwrc2009.confreaks.com/13-mar-2009-16-10-ffi-jeremy-hinegardner.html
@ephemient、私は実際に、Ruby(高レベル+動的)をメインコントローラーロジックとして使用し、大量のデータ処理(機能+速度)のためにhaskellを呼び出す方法を探しています
このツイートを除けば、ネイティブバインディングはほとんど存在しないと思いますhttp://twitter.com/BlurredWeasel/status/1321484127
JSON RPCを使用することは、Rubyに薄いラッパーがあり(method_missing)、JSON/Socketを介してhaskellを呼び出す場合に実装する最も簡単な方法です。
JSONには、プリミティブをさまざまな言語間のネイティブタイプに簡単にマップできるという利点があります。
class SciHs
def method_missing(method, *args)
// json encode
// request Haskell over tcp socket or unix pipes
// json decode
end
end
ルビーでの高速数値計算のその他の代替手段(+機能スタイル)
誰か考えますか?
私はまさにこれを試しました(私は言及されたツイートからのものです)。
私は libruby のアプローチについては考えていませんでしたが、Ruby の FFI を使用して haskell からエクスポートされた関数をラップしようとしてかなりの時間を費やしましたが、すべてをリンクして実行することはできませんでした。
Haskell の FFI の例を見ると、すべて C の main() 関数が含まれていることがわかります。ruby の FFI には main() がない (そして持つことができない) ため、これは機能しません。それなしで試すと、おかしなリンク エラーが発生します。
freenode (cschneid) または twitter (BlurredWeasel) で私に知らせてください。