19

私が書いているツール ( http://hackage.haskell.org/package/explore ) の場合、実行時に haskell 関数定義を読み取り、それらをツールの値に適用し、アプリケーションの結果を取得する方法が必要です.

GHC (6.10.4 または 6.12.1) API を使用した非常に基本的な例を誰か教えてもらえますか?

実行時にファイルから読み込まれる関数定義の例:

f x = 10**(4/1102*x - 1)

期待されるプログラム出力

--mapM_ print $ map f [428, 410, 389]
3.577165388142748
3.077536885227335
2.5821307011665815

!!アップデート!!
簡単な回答を投稿しましたが、実行ディレクトリにオブジェクト ファイルが作成されます。これを回避し、すべてのファイル IO を回避するためのヒントは大歓迎です。また、メモリ内ですべてを実行するバージョンも見たいです。たとえば、ユーザーが GUI で関数定義を提供し、コンパイル/評価によってオブジェクト ファイルが作成されません。

4

3 に答える 3

6

ヒントを使用します。これは、GHC APIのGHCiのようなラッパーであり、使用するのはそれほど難しくありません。

その使用例が必要な場合は、ヨーグルトプロジェクトで使用しました

于 2010-03-16T21:03:42.977 に答える
5

適応元:http ://www.bluishcoder.co.nz/2008/11/dynamic-compilation-and-loading-of.html

f.hs:

module Func (Func.f) where

f :: Double -> Double
f x = 10**(4/1102*x - 1)

main.hs:

import GHC
import GHC.Paths
import DynFlags
import Unsafe.Coerce

import Control.Monad

main :: IO ()
main =
    defaultErrorHandler defaultDynFlags $ do
      func <- runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        setSessionDynFlags dflags
        target <- guessTarget "f.hs" Nothing
        addTarget target
        r <- load LoadAllTargets
        case r of
          Failed -> error "Compilation failed"
          Succeeded -> do
            m <- findModule (mkModuleName "Func") Nothing
            setContext [] [m]
            value <- compileExpr ("Func.f")
            do let value' = (unsafeCoerce value) :: Double -> Double
               return value'
      let f = func
      mapM_ print $ map f [428, 410, 389]
      return ()
于 2010-03-16T00:52:43.913 に答える
4

API がうまく機能するようになりました。コード ジェネレーターのしくみについて少し説明できます。

GHC はシステム アセンブラを使用して .o ファイルを作成します。GHC をクリーンアップするオプションがない場合は、http://hackage.haskell.org/trac/ghc/newticket ?type= のバグ トラッカーを使用して、API に対して機能要求を提出する必要があります。機能+リクエスト。リクエストを提出するには、アカウントを登録する必要があります。

標準のコード ジェネレータを使用すると、ファイル I/O を完全に回避することはできません。これは、GHC が再配置可能なオブジェクト コードを作成する作業をアセンブラに委任するからです。LLVM に基づいた実験的なバックエンドがあり、メモリ内ですべてを実行できる可能性がありますが、6.13 より前のバージョンで利用できるとしたら驚きです。ただし、GHC 開発者リストで質問する価値はあります。

于 2010-03-16T01:12:46.040 に答える