我的哈姆雷特模板中有一个如下所示的条件:
$if (&&) (index == 0) (row == 0)
工作正常。如果我尝试重写这个更自然的
$if (index == 0) && (row == 0)
或
$if ((index == 0) && (row == 0))
然后它不解析。错误消息是:
尝试运行编译时代码时出现异常:
意外“&”
期待“)”
这令人费解;它是否支持一些二元运算符而不支持其他运算符?
在哈姆雷特的$if
语句中,可以使用哪些规则来管理哪些表达式?
答案 0 :(得分: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