簡體   English   中英

使用GHC API評估Haskell語句/表達式

[英]Evaluation of Haskell Statements/Expressions using GHC API

對於我正在編寫的工具( 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

!! UPDATE!
我發布了一個快速回答,但它在執行目錄中創建了一個目標文件,任何提示都可以避免這種情況並避免使用所有文件IO。 我還希望看到一個在內存中執行所有操作的版本:例如,用戶在GUI中提供函數定義,編譯/評估不會創建任何目標文件。

使用提示 它是一個類似GHCi的GHC API包裝器,並不是很難使用。

如果你想要一個使用它的例子,我在我的Yogurt項目中使用它

改編自: 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 ()

獲得API的好工作。 我可以告訴你一些關於代碼生成器如何工作的信息。

GHC使用系統匯編程序創建.o文件。 如果沒有可用的選項讓GHC自行清理,那么您應該使用http://hackage.haskell.org/trac/ghc/newticket?type=上的錯誤跟蹤器提交針對API的功能請求。 功能+請求 要提交請求,您需要注冊一個帳戶。

使用標准代碼生成器,您將無法完全避免文件I / O,因為GHC將創建可重定位目標代碼的工作委托給匯編程序。 有一個基於LLVM的實驗后端可能能夠在內存中完成所有操作,但如果它在6.13之前的任何內容中都可用,我會感到驚訝。 然而,值得在GHC開發者名單上詢問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM