$ if表达式在哈姆雷特

时间:2013-11-28 09:59:40

标签: haskell if-statement hamlet

我的哈姆雷特模板中有一个如下所示的条件:

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

工作正常。如果我尝试重写这个更自然的

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

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

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

  

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

     

意外“&”

     

期待“)”

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

在哈姆雷特的$if语句中,可以使用哪些规则来管理哪些表达式?

1 个答案:

答案 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