2012-12-21 12 views
7

Attualmente sto cercando di eseguire una traduzione da un sottoinsieme Haskell senza dover affrontare tutti i problemi di parsing, typechecking, ecc. La documentazione non mi ha aiutato a capire una funzione per ottenere il corpo della funzione (tutte le definizioni) con il suo nome.Come utilizzare Template Haskell per ottenere il corpo della funzione?

contesto per questa chiamata dovrebbe essere simile

fac 0 = 1 
fac x = z * fac (x - 1) 

getBody = ... 

main = do 
    x <- runQ $ getBody [| fac |] 
    print x 

Qualcuno sa

  1. se ci sono alcuni buoni e fino a documenti di data su TH (non il riferimento sulla Hackage) o
  2. come creare getBody?
+1

Cosa stai provando a fare con 'runQ' qui? Abbastanza sicuro che non ci sia modo di ottenere le informazioni che vuoi provare a usare TH in fase di esecuzione. –

risposta

10

In generale, il modo per trovare la definizione di qualcosa con TH sta utilizzando la funzione reify. Tuttavia:

Sembra che dovrai trovare un altro percorso. Hai preso in considerazione l'utilizzo di the haskell-src-exts package per l'analisi e/o l'API GHC o qualcosa basato su di esso?

+0

Sì, non possiamo usare reify in fase di esecuzione, ma possiamo usare i dati restituiti. Sembra che questo (menzioni questo codice deve essere diviso in 2 moduli a causa della restrizione di fase GHC, anche in GHCi): 'conv1 (TyConI x) = [| TyConI $ (conv2 x) |] ' ' conv2 (DataD _ nome _ _ _) = [| DataD [] (mkName $ (restituisce $ LitE $ stringL $ nome show)) [] [] [] |] ' ' main = stampa $ (reify '' Int >> = conv1) ' Inoltre,' reify' restituirebbe AST per il _call_ della funzione, ma non è il corpo, comunque. Ci dovrebbe essere la funzione reifyDecl, che è davvero assente. Mi sento davvero grato per il vostro aiuto. Grazie. –

+0

@ polkovnikov.ph: L'uso di 'reify' sul nome di qualcosa generalmente ti dà la dichiarazione, quando questo ha senso - per un tipo ti darà la lista dei costruttori, la lista' derivante', e così via. 'reify'ing il nome di una funzione ti dà un' VarI' per le informazioni, che ha un valore 'Maybe Dec', cioè una dichiarazione. Se capisco cosa vuoi, 'reify' lo farebbe, non è implementato proprio adesso perché apparentemente poche altre persone lo vogliono. –

+0

Per chiunque possa leggere questo: sarei interessato a lavorare su questa funzione nel prossimo futuro. Potrei davvero usarlo. – jtobin

Problemi correlati