4

printfQ最近、次のコードのように、アンチクォート機能を備えた quasiquoter を実装する方法を学びました。

main = do
  let itemName = "apple"
      price = 1.29 
  [printfQ| The price of #{itemName} is #{price}. |]

quasiquote の成分文字列が に渡されquoteExp printfQ :: String -> ExpQます。したがって、与えられた を解析し、埋め込む名前とStringを見つけ、各名前に適用し、 を構築します。"itemName""price"varE . mkNameExpQ

これを拡張しprintfQて、次のように式の埋め込みを許可するとします。

[printfQ| The price of #{itemNames !! i} is #{price + taxOf price}. |]

"itemNames !! i"2 つの文字列とを検出するパーサーを作成できます"price + taxOf price"。しかし、さらに強力なバージョンの が必要です。これは、これらの文字列をに変換するvarE . mkName型の関数であり、使用されている名前空間を参照する式として解釈します。String -> ExpQExpQprintfQ

私の質問:この文字列を AST に変換するライブラリ関数はありますか? これを行う簡単な方法はありますか、それとも Haskell パーサー全体を作成する必要がありますか?

  • この質問は、この質問と密接に関連していますIs there a template haskell function for quoteing? より焦点を絞った明確な方法で質問を述べることが、コミュニティが答えを見つけるのに役立つことを期待して、これを投稿しています.
4

1 に答える 1