【发布时间】:2016-12-06 15:20:48
【问题描述】:
我正在 HaTeX 之上构建一个 eDSL。我面临的问题是我想在我的 LaTeX 文档中显示 Haskell 表达式,并且我想使用相同的 Haskell 表达式来帮助生成文档。
显而易见的答案是复制并粘贴表达式,以使其同时显示为引用和实时。我想避免这种情况,因为表达式可能会发生变化。
我想象的是一个准引用器,它既可以拼接它的内容,又可以输出一个表示它的字符串。
例如,我想输入以下内容:
document = do
title "this is an example document"
paragraph "This is normal text. We will now show the Haskell code that generates a table"
[quoted| makeTable ["heading1","heading2"] ["cell1","cell2"] |]
我想把准引用扩展到:
document = do
title "this is an example document"
paragraph "This is normal text. We will now show the Haskell code that generates a table"
makeTable ["heading1","heading2"] ["cell1","cell2"]
listing Haskell "makeTable [\"heading1\",\"heading2\"] [\"cell1\",\"cell2\"]"
为此,我需要编写一个 QuasiQuoter:
quoted :: QuasiQuoter
quoted = QuasiQuoter
{ quoteExp = \str -> [e| $(_ str) >> listing Haskell $(lift str) |] }
我不确定用什么替换 $(_ str) 中的孔。我需要用 Haskell 表达式 quasi quoter 替换它,但我不确定如何调用它。如果e 是e :: QuasiQuoter,我可以用$(quoteExp e str) 填充这个洞,但不幸的是它不起作用。我应该填什么?
【问题讨论】: