打印并执行字符串

Mat*_*hid 7 haskell template-haskell

我发现自己写了很多代码

putStr "foo (bar 1) (bar 2) ="
print $ foo (bar 1) (bar 2)

麻烦的是,打印的消息可能与实际执行的代码不同步.显而易见的解决方案是自动生成此代码.

一种方法是将所有文本放在一个文件中,然后编写一个小程序来读取文件并从中生成Haskell源代码.但另一种选择是使用Template Haskell.

有没有人知道如何编写一个函数来获取String并从中生成上述代码?我猜它应该很容易,但TH没有很好的记录.

sha*_*ang 9

您可以使用该haskell-src-meta包解析Haskell代码.这是一个快速示例,您可以将其与Template Haskell结合使用.

{-# LANGUAGE TemplateHaskell #-}

import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Language.Haskell.Meta

runShow = QuasiQuoter
    { quoteExp  = runShowQQ
    , quotePat  = undefined
    , quoteType = undefined
    , quoteDec  = undefined
    }

runShowQQ :: String -> Q Exp
runShowQQ s = do
    let s'          = s ++ " = "
        Right exp = parseExp s
        printExp  = appE [|print|] (return exp)
    infixApp [|putStr s'|] [|(>>)|] printExp
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它

{-# LANGUAGE QuasiQuotes #-}

[runShow|foo (bar 1) (bar 2)|]
Run Code Online (Sandbox Code Playgroud)

  • 那么你所说的是,有人已经将Haskell解析器实现为准引用,你可以使用它吗?(不得不爱它到底说"还没有完整"......)首先不能将GHC的_existing_ Haskell解析器视为准引用者似乎很可惜...我想知道他们为什么不穿不支持吗? (3认同)