1

我正在编写一个 Haskell 命令行程序并使用lt来自Text.Shakespeare.Text. 在Yesod book中,它说hamlet如果第一个非空白字符是反斜杠 ( \),则准引用器会忽略前导空白。

这在lt准报价器中有效吗?

我的代码如下所示:

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

但输出是

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

Version字符串缩进太远(并且仍然包含反斜杠)。我还尝试在反斜杠和V.

莎士比亚文本可以做到这一点吗?

4

1 回答 1

3

它似乎没有,但是自己添加该功能并不难。lt只是 a 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使用字符串转换函数转换 a 的函数很简单:

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"Usage: SomeProgram [OPTIONS...]\nVersion 42.42.42"在 ghci 中计算为。

于 2013-09-01T07:02:21.013 回答