2

我的 Hamlet 模板中有一个条件,如下所示:

    $if (&&) (index == 0) (row == 0)

效果很好。如果我尝试将其重写为更自然

    $if (index == 0) && (row == 0)

或者

    $if ((index == 0) && (row == 0))

然后它不解析。错误信息是:

尝试运行编译时代码时出现异常:

意外的“&”

期待“)”

这令人费解;它是否支持某些二元运算符但不支持其他运算符?

$if在哈姆雷特的语句中可以使用哪些类型的表达式的规则是什么?

4

1 回答 1

1

事实上,我没有看到 Yesod 书或 API 文档中对此进行了定义。

最好的办法是阅读源代码,例如https://github.com/yesodweb/shakespeare/blob/master/hamlet/Text/Hamlet/Parse.hs#L458

我认为后面的项目直接$if来自 parseDeref https://github.com/yesodweb/shakespeare/blob/master/shakespeare/Text/Shakespeare/Base.hs#L96

确实可以隔离您的观察(在 ghci 中输入):

import Text.Shakespeare.Base
import Test.Parsec

parse parseDeref "source" "(a && b)"

    Left "source" (line 1, column 4):
    unexpected "&"
    expecting ")"

parse parseDeref "source" "(&&) a b"

    Right (DerefBranch (DerefBranch (DerefIdent (Ident "&&")) (DerefIdent (Ident "a"))) (DerefIdent (Ident "b")))

最终,解析器调用Data.Char.isSymbol,令我惊讶的是,

isSymbol '='   ==> True
isSymbol '&'   ==> False
于 2013-11-28T10:32:38.000 回答