我正在编写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
之间的空格。
这可能与莎士比亚文本有关吗?
答案 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"
。