忽略" lazy-text"中的前导空格Haskell Text.Shakespeare.Text中的quasiquoter

时间:2013-08-31 21:50:05

标签: haskell yesod shakespeare-text

我正在编写Haskell命令行程序并使用lt中的Text.Shakespeare.Text quasiquoter(“lazy-text”)。在Yesod book中,它表示如果第一个非空白字符是反斜杠(hamlet),则\ quasiquoter会忽略前导空格。

这是否适用于lt quasiquoter?

我的代码如下所示:

[lt|Usage: #{programName} [OPTION ...]
   \Version #{showVersion version}|]

但输出是

Usage: MyProg [OPTION ...]
    \Version 0.1.0.0

Version字符串缩进太多(仍然包含反斜杠)。我也尝试用反斜杠和V之间的空格。

这可能与莎士比亚文本有关吗?

1 个答案:

答案 0 :(得分:3)

它似乎并不存在,但是自己添加功能并不困难。 lt只是QuasiQuoter,是数据类型:

QuasiQuoter {
   quoteExp :: String -> Q Exp
 , quotePat :: String -> Q Pat
 , quoteType :: String -> Q Type
 , quoteDec :: String -> Q [Dec]
}

他们采用String,并返回相应的模板haskell类型(取决于它所使用的上下文。

转换字符串是一件简单的事情,因此它可以像你用正则表达式所描述的那样工作:

stripWhiteSpaceBeforeBackslash :: String -> String
stripWhiteSpaceBeforeBackslash str = subRegex (mkRegex "^[[:space:]]*\\\\") str ""

此外,使用字符串转换函数转换QuasiQuoter的函数很简单:

transformQuasiQuoter :: (String -> String) -> QuasiQuoter -> QuasiQuoter
transformQuasiQuoter transform quasi = QuasiQuoter {
    quoteExp = (quoteExp quasi) . transform
  , quotePat = (quotePat quasi) . transform
  , quoteType = (quoteType quasi) . transform
  , quoteDec =  (quoteDec quasi) . transform
  }

现在,您可以制作满足您需要的lt版本:

lt_ = transformQuasiQuoter stripWhiteSpaceBeforeBackslash lt

使用它按预期工作:

programName = "SomeProgram"
showVersion _ = "42.42.42"
version = 34

x = [lt_|Usage: #{programName} [OPTIONS...]
        \Version #{showVersion version}|]

x评估为ghci中的"Usage: SomeProgram [OPTIONS...]\nVersion 42.42.42"

相关问题