gpt4 book ai didi

c - 是否可以在运行时生成并运行 TemplateHaskell 生成的代码?

转载 作者:太空狗 更新时间:2023-10-29 17:00:01 25 4
gpt4 key购买 nike

是否可以在运行时生成并运行 TemplateHaskell 生成的代码?

使用 C,在运行时,我可以:

  • 创建函数的源代码,
  • 调用 gcc 将其编译为 .so (linux)(或使用 llvm 等),
  • 加载.so 和
  • 调用函数。

Template Haskell 是否可以做类似的事情?

最佳答案

是的,这是可能的。 GHC API 将编译 Template Haskell。 https://github.com/JohnLato/meta-th 提供概念验证,虽然不是很复杂,但展示了一种通用技术,甚至提供了一点类型安全。模板 Haskell 表达式是使用 Meta 类型构建的,然后可以将其编译并加载到可用函数中。

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}

{-# OPTIONS_GHC -Wall #-}
module Data.Meta.Meta (
-- * Meta type
Meta (..)

-- * Functions
, metaCompile
) where

import Language.Haskell.TH

import Data.Typeable as Typ
import Control.Exception (bracket)

import System.Plugins -- from plugins
import System.IO
import System.Directory

newtype Meta a = Meta { unMeta :: ExpQ }

-- | Super-dodgy for the moment, the Meta type should register the
-- imports it needs.
metaCompile :: forall a. Typeable a => Meta a -> IO (Either String a)
metaCompile (Meta expr) = do
expr' <- runQ expr

-- pretty-print the TH expression as source code to be compiled at
-- run-time
let interpStr = pprint expr'
typeTypeRep = Typ.typeOf (undefined :: a)

let opener = do
(tfile, h) <- openTempFile "." "fooTmpFile.hs"
hPutStr h (unlines
[ "module TempMod where"
, "import Prelude"
, "import Language.Haskell.TH"
, "import GHC.Num"
, "import GHC.Base"
, ""
, "myFunc :: " ++ show typeTypeRep
, "myFunc = " ++ interpStr] )
hFlush h
hClose h
return tfile
bracket opener removeFile $ \tfile -> do

res <- make tfile ["-O2", "-ddump-simpl"]
let ofile = case res of
MakeSuccess _ fp -> fp
MakeFailure errs -> error $ show errs
print $ "loading from: " ++ show ofile
r2 <- load (ofile) [] [] "myFunc"
print "loaded"

case r2 of
LoadFailure er -> return (Left (show er))
LoadSuccess _ (fn :: a) -> return $ Right fn

此函数接受一个 ExpQ,并首先在 IO 中运行它以创建一个普通的 ExpExp 然后被漂亮地打印到源代码中,在运行时编译和加载。在实践中,我发现更困难的障碍之一是在生成的 TH 代码中指定正确的导入。

关于c - 是否可以在运行时生成并运行 TemplateHaskell 生成的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14459577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com