当前位置:  开发笔记 > 后端 > 正文

Haskell通过FFI与Ruby绑定?

如何解决《Haskell通过FFI与Ruby绑定?》经验,为你挑选了3个好方法。

由于ruby和Haskell都支持FFI,

是否有可能从ruby调用Haskell代码,可能是通过FFI?

Ruby中有任何Haskell绑定吗?

Mark Wotton.. 11

我讨论的时间有点晚了,但我现在正在写Ruby和Haskell之间的桥梁.它位于http://github.com/mwotton/Hubris-它是一个在C级工作的绑定.尽管如此,仍处于发展的初期阶段.



1> Mark Wotton..:

我讨论的时间有点晚了,但我现在正在写Ruby和Haskell之间的桥梁.它位于http://github.com/mwotton/Hubris-它是一个在C级工作的绑定.尽管如此,仍处于发展的初期阶段.



2> Dan..:

GHC 6.12.1支持在Linux上构建动态库.尝试类似的东西:

Example.hs

{-# 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

wrapper.c

#include 

#include "HsFFI.h"

void
example_init (void)
{
  hs_init (NULL, NULL);
}

void
example_exit (void)
{
  hs_exit ();
}

script.rb

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

Makefile文件

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



3> ephemient..:

我以前没有看过它,但它是可能的.

使用Haskell的FFI进行包装libruby.你的主要可执行文件将用Haskell编写,它将调用ruby_init()和相关的函数,以便在进程中运行Ruby解释器.但这确实允许您运行任意Ruby代码.

使用Ruby的FFI将GHC模块包装为库.您的Ruby脚本必须调用hs_init(),并且只能访问foreign exported函数.

您需要编写胶水代码,其中一些在C中,以获得这两个选项中的任何一个.

在单独的进程中运行Ruby和Haskell,使用一些IPC在它们之间进行通信.也许XML-RPC(Haskell/Ruby),或JSON(Haskell/Ruby)通过套接字,甚至可能只是管道与您自己的自定义协议.

我不知道你的要求是什么,但这就是我想要的 - 它更容易.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有