对于我正在编写的工具( 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中提供函数定义,而编译/求值不创建任何对象文件。
发布于 2010-03-16 08:52:44
改编自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 ()https://stackoverflow.com/questions/2451354
复制相似问题