首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用GHC API评估Haskell语句/表达式

使用GHC API评估Haskell语句/表达式
EN

Stack Overflow用户
提问于 2010-03-16 08:12:38
回答 3查看 2.7K关注 0票数 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中提供函数定义,而编译/求值不创建任何对象文件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-17 05:03:43

使用hint。它是一个类似GHCi的包装,围绕着GHC API,使用起来并不是很困难。

如果您想了解它的用法示例,我可以使用used it in my Yogurt project

票数 6
EN

Stack Overflow用户

发布于 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 ()
票数 5
EN

Stack Overflow用户

发布于 2010-03-16 09:12:46

让API运行起来的工作做得很好。我可以告诉你一些关于代码生成器是如何工作的。

GHC使用系统汇编程序创建一个.o文件。如果没有一个选项可以让GHC自己清理,那么你应该使用http://hackage.haskell.org/trac/ghc/newticket?type=feature+request上的bug跟踪器提交一个针对API的功能请求。为了提交申请,您需要注册一个帐户。

使用标准代码生成器,您将无法完全避免文件I/O,因为GHC将创建可重定位目标代码的工作委托给了汇编程序。有一个基于LLVM的实验性后端,它可能能够在内存中执行所有操作,但如果它在6.13之前的版本中可用,我会感到惊讶。然而,在GHC开发人员列表上询问一下可能是值得的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2451354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档