2017-03-23 3 views
3

Ein Beispiel sagt mehr als tausend Worte. Hier ist eine ziemlich einfache quasi quoter, die ich gerade erfunden habe.Variablen in Vorlage Haskell benutzerdefinierte Quasiquoter

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" 

Dann wird unter Verwendung es in GHCi

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

Ich würde 2-x gebunden zu sein, gefallen. Also: Gibt es eine Möglichkeit, variable Muster in benutzerdefinierten Quasi-Anführungszeichen einzuführen, die wir wieder verwenden können? Beachten Sie, dass mein tatsächlicher Anwendungsfall ein bisschen mehr beteiligt ist als das oben genannte - parse tatsächlich einige wesentliche Arbeit.

EDIT

Die folgenden Werke:

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

und die folgende nicht

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

so ist dies ein Fehler in GHCi?

+0

Das Verhalten in GHC 7.10.3 kann nicht reproduziert werden. – Zeta

+0

@ Zeta Cool. Ich werde es am 7.10.3 ausprobieren, nur um es zu überprüfen, dann werde ich einen Fehler einreichen. Ich werde hier zurück posten, sobald das erledigt ist. – Alec

+0

[Abgelegt als ein Fehler] (https://ghc.haskell.org/trac/ghc/ticket/13473#ticket). Hinweis: Ich bin nicht davon überzeugt, dass dies wirklich ein Fehler ist .... – Alec

Antwort