RubyからHaskellを呼び出すライブラリ
RubyからHaskellを呼び出すライブラリ、Rubiskellを作ってみた - Greenbear Diary
yharaさん、GJです。
runghcはお手軽でよいのですが、Rubyの拡張ライブラリとしてHaskellを直接組込めないものでしょうか? この辺の技術を組み合わせればできそうな気がしますが、あまりにマニアックすぎて僕はよく知りません。
とりあえずフィボナッチをコンパイルして実行するコード。んー、上のドキュメントとGHCのソースを読みながら書いてみたのですが、まだまだ謎な部分が多いです。GHC.runStmtの後でバインドされてる値を取り出すのはどうやるんだろう。。。
ファイル: a.hs
module Main (main) where import qualified GHC import qualified DynFlags import qualified PackageConfig ghcHandler :: IO a -> IO () ghcHandler f = GHC.defaultErrorHandler DynFlags.defaultDynFlags f >> return () ghcInit :: FilePath -> [(String, String)] -> IO GHC.Session ghcInit path modules = do session <- GHC.newSession $ Just path GHC.setSessionDynFlags session =<< GHC.getSessionDynFlags session GHC.setContext session [] $ map f modules return session where f (pkg, name) = GHC.mkModule (PackageConfig.stringToPackageId pkg) (GHC.mkModuleName name) ghcRun :: GHC.Session -> String -> IO GHC.RunResult ghcRun session stmt = GHC.runStmt session stmt GHC.RunToCompletion main :: IO () main = ghcHandler $ do session <- ghcInit "C:\\ghc\\ghc-6.8.1" [("base", "Prelude")] ghcRun session "let fib n | n == 0 = 0 | n == 1 = 1 | True = fib (n - 2) + fib (n - 1)" ghcRun session "fib 10"
実行例:
>ghc -package ghc a.hs >main 55
参照:
- メソッド名一覧の表示 - どう書く? org GHC as a libraryのAPIを使って、GHCでリフレクションぽいことをやっています。
- HaskellからRubyを呼んでみる(2) - 趣味的にっき 以前HaskellからRubyを呼ぶのを試して、そのまま放置していたのを思い出しました。