Haskell, связывающий с Ruby через FFI?

Ваш пример JSON не выглядит многомерным массивом. Это массив с кучей объектов в нем. Если это для Java, почему бы не использовать Джексона или GSon или подобную библиотеку для получения объекта в списке массивов! Все, что вам нужно определить, это объект POJO с соответствующими именами переменных с геттерами и сеттерами.

7
задан Johan Dahlin 3 February 2010 в 00:12
поделиться

6 ответов

Я не видел сделанный прежде, но это возможно.

  • Используйте FFI Haskell для обертывания libruby. Ваш основной исполняемый файл будет записан в Haskell, который будет звонить ruby_init() и связанные функции, для выполнения незавершенного интерпретатора Ruby. Это действительно позволяет Вам выполнять произвольный код Ruby, все же.
  • Используйте FFI Ruby для обертывания модуля GHC как библиотеки. Ваш сценарий Ruby должен звонить hs_init(), и может только получить доступ foreign exportфункции редактора.

Необходимо будет написать код связующего звена, некоторых в C, для получения любой из тех двух опций работа.

  • Выполните Ruby и Haskell в отдельных процессах, с помощью некоторого IPC для передачи между ними. Возможно, XML-RPC (Haskell/Ruby) или JSON (Haskell/Ruby) по сокетам, или возможно даже просто передают по каналу с Вашим собственным протоколом.

Я не знаю, каковы Ваши требования, но это - то, для чего я пошел бы - это намного легче.

6
ответ дан 6 December 2019 в 06:51
поделиться

Я попробовал точно это (я - тот из упомянутого твита).

Я не думал о подходе libruby, но я потратил изрядное количество, пытающееся использовать FFI рубина для обертывания экспортируемой функции от haskell, и никогда не мог вполне получать его ко всей ссылке и работать.

При рассмотрении примеров haskell FFI Вы будете видеть, что они все включают основное C () функция. Так как FFI рубина не имеет (и не может иметь) основное (), который не будет работать. Если Вы пробуете без этого, Вы заканчиваете со странными ошибками ссылки.

Я могу совместно использовать то, что я имею с Вами, проверяю с помощью ping-запросов меня на freenode (cschneid), или в Твиттере (BlurredWeasel).

0
ответ дан 6 December 2019 в 06:51
поделиться

@ephemient, я на самом деле ищу someways для использования Ruby (высокий уровень + динамичный), чтобы быть логикой основного контроллера и вызывающий haskell для большого объема данных, уплотняющего (функциональный + скорость)

Я думаю, что собственная привязка близко к несуществованию кроме этого твита http://twitter.com/BlurredWeasel/status/1321484127

Используя RPC JSON будет, вероятно, самый легкий способ реализовать, где существует тонкая обертка в рубине к (method_missing) для вызова haskell по JSON/Socket.

JSON имеет преимущество способности легко отобразить примитивы на собственные типы между различными языками..

class SciHs
  def method_missing(method, *args) 
     // json encode
     // request Haskell over tcp socket or unix pipes
     // json decode
  end
end 

Другая альтернатива для быстрого перемалывания чисел в рубине (+ функциональный стиль)

  • NArray или другая научная библиотека в рубине
  • Привязка Ruby GNU Научная Библиотека
  • или пойдите рубиновые 1.9 и используйте YARV2LLVM для JIT логика вычисления в LLVM для более быстрого выполнения.

Мысли кто-либо?

0
ответ дан 6 December 2019 в 06:51
поделиться

Я не уверен в стороне Haskell, но здесь являюсь прохладным видео с Горы на запад Ruby Conf 09 о работе с FFI от Ruby. Это похоже на довольно хороший интерфейс.

http://mwrc2009.confreaks.com/13-mar-2009-16-10-ffi-jeremy-hinegardner.html

1
ответ дан 6 December 2019 в 06:51
поделиться

Я немного опоздал с этим обсуждением, но в настоящее время я пишу мост между Ruby и Haskell. Это http://github.com/mwotton/Hubris - это привязка, которая работает на уровне C. Однако все еще находится на очень ранней стадии разработки.

11
ответ дан 6 December 2019 в 06:51
поделиться

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 <stdlib.h>

#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
8
ответ дан 6 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: