2017-03-23 1 views
3

예를 들어 천 단어의 가치가 있습니다. 여기에 꽤 간단합니다. quasi quoter 방금 ​​작성했습니다.템플릿의 변수 하스켈 커스텀 쿼티 퀴어

import Language.Haskell.TH.Quote 
import Language.Haskell.TH.Syntax 

quoter :: QuasiQuoter 
quoter = QuasiQuoter { quotePat = parse } 
    where 
    parse :: String -> Q Pat 
    parse ('$':x) = pure (VarP (mkName x)) 
    parse "_" = pure WildP 
    parse _ = fail "Invalid pattern" 

그럼, x에 바인딩 할 2를 좋아했을

ghci> :set -XQuasiQuotes 
ghci> [quoter|_|] = 2 
ghci> [quoter|$x|] = 2 
ghci> x 
error: Variable not in scope: x 

GHCi

에서 사용. 그래서 다시 사용할 수있는 사용자 정의 유사 따옴표에 변수 패턴을 도입 할 수있는 방법이 있습니까? 실제 사용 사례는 위의 것보다 훨씬 복잡합니다. parse 실제는 실제 작업을 수행합니다.

편집

다음 작품 :

ghci> inc [quoter|$x|] = x + 1 
ghci> inc 2 
3 

다음은

ghci> let [quoter|$x|] = 1 in x 
error: Variable not in scope: x 

그래서 이것은 GHCi의 버그하지 않는 이유는 무엇입니까?

+0

GHC 7.10.3에서 동작을 재현 할 수 없습니다. – Zeta

+0

@Zeta Cool. 7.10.3에서 두 번 확인해 보도록하겠습니다. 그런 다음 버그를 신고하겠습니다. 그 일이 끝나면 여기로 다시 올리겠습니다. – Alec

+0

[버그로 제출] (https://ghc.haskell.org/trac/ghc/ticket/13473#ticket). 참고 이것은 심지어 이것이 실제로 버그라고 확신하지는 않습니다. – Alec

답변