【问题标题】:$if expressions in Hamlet哈姆雷特中的 $if 表达式
【发布时间】:2013-11-28 09:59:40
【问题描述】:

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

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

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

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

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

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

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

意外的“&”

期待“)”

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

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

【问题讨论】:

    标签: haskell if-statement hamlet


    【解决方案1】:

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

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

    我认为$if 之后的项目直接来自 parseDerefhttps://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
    

    【讨论】:

    • 有趣。这是一个巨大的错误。 isSymbol 返回 Unicode 类别 符号 中的字符。许多运算符,包括&/? 都属于Unicode 类别标点符号。感谢您挖掘它。
    • 链接已损坏。
    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多