2013-11-28 1 views
1

의 표현은 I은 다음과 같습니다 내 햄릿 템플릿에 조건이있는 경우 : 잘 작동

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

. 내가하려고하면 더 자연

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

또는

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

다음은 구문 분석하지 않는 한이를 다시 작성합니다. 오류 메시지는 다음과 같습니다 실행하려고

예외 컴파일 타임 코드 : 기대

예상치 못한 "&"

")"이 기괴

; 일부 바이너리 연산자는 지원하지만 다른 연산자는 지원하지 않습니까?

햄릿에있는 $if 문에 어떤 종류의 표현식을 사용할 수 있는지를 결정하는 규칙은 무엇입니까?

답변

1

실제로 이것이 Yesod 책이나 API 문서에 정의되어있는 것은 아닙니다.

가장 좋은 건 소스를 읽는 것입니다.

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를 호출하고,에 : 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이 입력) 분리 될 수 온다 놀랍게도,

isSymbol '=' ==> True 
isSymbol '&' ==> False 
+0

흥미 롭 군. 그것은 엄청난 버그입니다. 'isSymbol'는 유니 코드 범주의 문자를 반환합니다 * Symbol *. '&','/'및'? '를 포함한 많은 연산자는 Unicode 범주 * Punctuation *에 있습니다. 그걸 파고 줘서 고마워. – Timwi