由于ruby和Haskell都支持FFI,
是否有可能从ruby调用Haskell代码,可能是通过FFI?
Ruby中有任何Haskell绑定吗?
Mark Wotton.. 11
我讨论的时间有点晚了,但我现在正在写Ruby和Haskell之间的桥梁.它位于http://github.com/mwotton/Hubris-它是一个在C级工作的绑定.尽管如此,仍处于发展的初期阶段.
我讨论的时间有点晚了,但我现在正在写Ruby和Haskell之间的桥梁.它位于http://github.com/mwotton/Hubris-它是一个在C级工作的绑定.尽管如此,仍处于发展的初期阶段.
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#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
我以前没有看过它,但它是可能的.
使用Haskell的FFI进行包装libruby
.你的主要可执行文件将用Haskell编写,它将调用ruby_init()
和相关的函数,以便在进程中运行Ruby解释器.但这确实允许您运行任意Ruby代码.
使用Ruby的FFI将GHC模块包装为库.您的Ruby脚本必须调用hs_init()
,并且只能访问foreign export
ed函数.
您需要编写胶水代码,其中一些在C中,以获得这两个选项中的任何一个.
在单独的进程中运行Ruby和Haskell,使用一些IPC在它们之间进行通信.也许XML-RPC(Haskell/Ruby),或JSON(Haskell/Ruby)通过套接字,甚至可能只是管道与您自己的自定义协议.
我不知道你的要求是什么,但这就是我想要的 - 它更容易.