1

Haskell コマンド ライン プログラムを作成しltText.Shakespeare.Text. Yesod bookでは、hamlet空白文字以外の最初の文字がバックスラッシュ ( ) の場合、quasiquoter は先頭の空白文字を無視すると述べています\

これはltquasiquoterで機能しますか?

私のコードは次のようになります。

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

しかし、出力は

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

Version文字列がインデントされすぎています (バックスラッシュが含まれています) 。バックスラッシュとV.

これはシェイクスピアテキストで可能ですか?

4

1 に答える 1

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文字列変換関数で 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 に答える