gpt4 book ai didi

haskell - 使用 GHC 的 API 或提示从已编译的二进制文件中导入已知函数

转载 作者:行者123 更新时间:2023-12-04 21:24:42 24 4
gpt4 key购买 nike

我有一个模块 Target , 函数 Target.accessMe在里面。我以某种方式编译这个模块,然后去掉源代码。

现在,我必须执行哪些神秘的咒语才能使不同的程序动态导入 Target.accessMe ?这个程序知道accessMe的类型提前。另外,考虑 Target 的源代码这一事实。不可用。
plugins package 设法做到了这一点,但在 Windows 上工作似乎有严重的问题。我已经 checkout plugins的来源,但我无法理解它。

我试过使用 Hint ,但只能找出如何评估我有源代码的代码。

谢谢你的帮助!

最佳答案

这个问题的答案已经在别处给了我。 GHC API 能够做到这一点。这里有两个函数,其中一个编译Target.hs ,而其他访问 Target.accessMe (并且不再需要 Target 模块的源代码)。

import GHC
import DynFlags

compile :: String -> IO SuccessFlag
compile name = defaultRunGhc $ do
dynflags <- getSessionDynFlags
let dynflags' = dynflags -- You can change various options here.
setSessionDynFlags dynflags'

-- (name) can be "Target.hs", "Target", etc.
target <- guessTarget name Nothing
addTarget target
load LoadAllTargets -- Runs something like "ghc --make".

这是一个编译给定模块并返回编译是否成功的函数。它使用 defaultRunGhc辅助函数定义为:
import GHC.Paths (libdir)

defaultRunGhc :: Ghc a -> IO a
defaultRunGhc = defaultErrorHandler defaultDynFlags . runGhc (Just libdir)

现在是一个从编译模块中获取值的函数。此时不需要提供模块的源代码。
import Unsafe.Coerce (unsafeCoerce)

fetch :: String -> String -> IO Int -- Assumes we are fetching an Int value.
fetch name value = defaultRunGhc $ do
-- Again, you can change various options in dynflags here, as above.
dynflags <- getSessionDynFlags
let m = mkModule (thisPackage dynflags) (mkModuleName name)
setContext [] [(m, Nothing)] -- Use setContext [] [m] for GHC<7.

fetched <- compileExpr (name ++ "." ++ value) -- Fetching "Target.accessMe".
return (unsafeCoerce fetched :: Int)

就是这样!

关于haskell - 使用 GHC 的 API 或提示从已编译的二进制文件中导入已知函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5521129/

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