5

来自Yesod 书

当 Hamlet 被调用时,它会自动访问范围内的变量。不需要专门传入变量。

这是什么深奥魔法?它如何自动知道范围内的变量是什么?

4

2 回答 2

9

Hamlet 基于Template Haskell;特别是,quasiquoter (ie [hamlet| ... |]) 用于内联模板,而 splice (ie $(hamletFile "foo")) 用于从文件创建模板。然后使用 Template Haskell 的自省功能访问这些变量。

除了允许自动访问变量之外,这还有其他好处:

  • 生成的模板可能比在运行时解析和解释的模板更有效,因为 Hamlet 模板在编译时被编译为常规的 Haskell 代码。

  • 从文件中读取模板时,文件在编译时被解析并嵌入到生成的二进制文件中,因此模板不必在运行时保持在同一位置,并且模板的有效性是静态确保的。

我相信这些优势适用于所有莎士比亚家庭模板。Haddock 文档提供了有关可用准引用器和接头的更多信息。

于 2012-02-01T07:15:34.160 回答
4

这是 Haskell 的quasiquotation的一个特性,也就是[xxx| .... |]语法。

quasiquoter 可以访问范围内的任何变量,因此可以对它们进行插值。插值的实际实现(如果有的话)取决于准引用器本身。

于 2012-02-01T07:14:55.523 回答