如何将库或前奏导入 GHC.runGhc 运行的上下文中
How to import libraries or the prelude into the context in which GHC.runGhc runs
我正在尝试使用 GHC.dynCompileExpr
评估一些动态代码,如下所示。
module Main where
import Data.Dynamic
import GHC
import GHC.Paths as GHP
import GHC.Types
import GHC.Prim
import GHC.Num
main :: IO ()
main = do
dynval <- GHC.runGhc (Just GHP.libdir) $ do
setSessionDynFlags =<< getSessionDynFlags
GHC.dynCompileExpr "[3,2,4,0]::Integer"
let val = fromDynamic dynval :: Maybe [Integer]
putStrLn $ show val
然而,当我 运行 它时,它失败并出现错误:不在范围内:类型构造函数或 class ‘Integer’。好像在GHC.dynCompileExpr
运行s的上下文中,没有可用的库,连前奏都没有。我将如何着手将库或序曲导入到此上下文中?在 GHC.dynCompileExpr
中包含 import
语句只会导致解析错误。
这花了我一段时间才弄清楚,但我似乎找到了让它工作的方法。
module Main where
import Data.Dynamic
import GHC
import GHC.Paths ( libdir )
import GHC.Types
import GHC.Prim
import GHC.Num
import DynFlags
main :: IO ()
main = do
dynval <- GHC.runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
setContext [ IIDecl $ simpleImportDecl (mkModuleName "Prelude") ]
GHC.dynCompileExpr "[3, 2, 1, 0] :: [Prelude.Integer]"
let val = fromDynamic dynval :: Maybe [Integer]
putStrLn $ show val
解决方案似乎在以下行中:
setContext [ IIDecl $ simpleImportDecl (mkModuleName "Prelude") ]
这将 Prelude 带入上下文,表达式被正确计算,给出输出:
Just [3,2,1,0]
我从 here 那里得到了这段代码。希望对您有所帮助!
我正在尝试使用 GHC.dynCompileExpr
评估一些动态代码,如下所示。
module Main where
import Data.Dynamic
import GHC
import GHC.Paths as GHP
import GHC.Types
import GHC.Prim
import GHC.Num
main :: IO ()
main = do
dynval <- GHC.runGhc (Just GHP.libdir) $ do
setSessionDynFlags =<< getSessionDynFlags
GHC.dynCompileExpr "[3,2,4,0]::Integer"
let val = fromDynamic dynval :: Maybe [Integer]
putStrLn $ show val
然而,当我 运行 它时,它失败并出现错误:不在范围内:类型构造函数或 class ‘Integer’。好像在GHC.dynCompileExpr
运行s的上下文中,没有可用的库,连前奏都没有。我将如何着手将库或序曲导入到此上下文中?在 GHC.dynCompileExpr
中包含 import
语句只会导致解析错误。
这花了我一段时间才弄清楚,但我似乎找到了让它工作的方法。
module Main where
import Data.Dynamic
import GHC
import GHC.Paths ( libdir )
import GHC.Types
import GHC.Prim
import GHC.Num
import DynFlags
main :: IO ()
main = do
dynval <- GHC.runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
setContext [ IIDecl $ simpleImportDecl (mkModuleName "Prelude") ]
GHC.dynCompileExpr "[3, 2, 1, 0] :: [Prelude.Integer]"
let val = fromDynamic dynval :: Maybe [Integer]
putStrLn $ show val
解决方案似乎在以下行中:
setContext [ IIDecl $ simpleImportDecl (mkModuleName "Prelude") ]
这将 Prelude 带入上下文,表达式被正确计算,给出输出:
Just [3,2,1,0]
我从 here 那里得到了这段代码。希望对您有所帮助!