jmi*_*ite 6 haskell dynamic ghc hotswap ghc-api
我有一个应用程序,由于各种原因,我需要运行任意的,用户提供的代码.(SafeHaskell使这很好,更安全).我看过插件包,非常适合从光盘上的.hi文件加载.
但是,对于我的程序设计,如果我可以将这些用户程序存储在数据库中,然后将它们直接编译为我可以在程序中使用的函数,那将是理想的.
因此,如果我正在编译的函数具有以下类型:
someFunction :: MyIn -> MyOut
Run Code Online (Sandbox Code Playgroud)
我正在寻找一些将从字符串生成该函数的函数:
hotCompile :: String -> IO (MyIn -> MyOut)
Run Code Online (Sandbox Code Playgroud)
其中string包含"someFunction"的haskell代码.
有没有人知道是否有办法做到这一点,最好使用插件包?我稍微遇到过GHC API,但我不太了解它以及它与此有何关系.
请注意,我已经尝试过提示,但它不适合我的应用程序,因为它不是线程安全的.
hint使用我们可以eval非常轻松地定义的包,以下是一个作为独立脚本的示例(您仍然需要nix来运行它)
#!/usr/bin/env nix-shell
#! nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [hint])"
#! nix-shell -i "ghci -ignore-dot-ghci -fdefer-type-errors -XTypeApplications"
{-# LANGUAGE ScopedTypeVariables, TypeApplications, PartialTypeSignatures #-}
import Data.Typeable (Typeable)
import qualified Language.Haskell.Interpreter as Hint
-- DOC: https://www.stackage.org/lts-18.18/package/hint-0.9.0.4
eval :: forall t. Typeable t => String -> IO t
eval s = do
mr <- Hint.runInterpreter $ do
Hint.setImports ["Prelude"]
Hint.interpret s (Hint.as :: t)
case mr of
Left err -> error (show err)
Right r -> pure r
-- * Interpret expressions into values:
e1 = eval @Int "1 + 1 :: Int"
e2 = eval @String "\"hello eval\""
-- * Send values from your compiled program to your interpreted program by interpreting a function:
e3 = do
f <- eval @(Int -> [Int]) "\\x -> [1..x]"
pure (f 5)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |