Mar*_*ton 11
我讨论的时间有点晚了,但我现在正在写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
Run Code Online (Sandbox Code Playgroud)
#include <stdlib.h>
#include "HsFFI.h"
void
example_init (void)
{
hs_init (NULL, NULL);
}
void
example_exit (void)
{
hs_exit ();
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
make
ruby script.rb
Run Code Online (Sandbox Code Playgroud)
我以前没有看过它,但它是可能的.
libruby.你的主要可执行文件将用Haskell编写,它将调用ruby_init()和相关的函数,以便在进程中运行Ruby解释器.但这确实允许您运行任意Ruby代码.hs_init(),并且只能访问foreign exported函数.您需要编写胶水代码,其中一些在C中,以获得这两个选项中的任何一个.
我不知道你的要求是什么,但这就是我想要的 - 它更容易.
| 归档时间: |
|
| 查看次数: |
2695 次 |
| 最近记录: |