2014-04-10 10 views

risposta

8

Il commento di cui sopra che la funzione dà un suggerimento:

-- Assertion function. This simply ignores its boolean argument. 
-- The compiler may rewrite it to @('assertError' line)@. 

Quindi, basta usare GitHub ricerca del codice e la ricerca di assertError: search results

Questo trasforma il file RnExpr.lhs. Ricerca di assert in questo file, troverete il seguente codice:

finishHsVar :: Name -> RnM (HsExpr Name, FreeVars) 
-- Separated from rnExpr because it's also used 
-- when renaming infix expressions 
-- See Note [Adding the implicit parameter to 'assert'] 
finishHsVar name 
= do { this_mod <- getModule 
     ; when (nameIsLocalOrFrom this_mod name) $ 
     checkThLocalName name 

     ; ignore_asserts <- goptM Opt_IgnoreAsserts 
     ; if ignore_asserts || not (name `hasKey` assertIdKey) 
     then return (HsVar name, unitFV name) 
     else do { e <- mkAssertErrorExpr 
       ; return (e, unitFV name) } } 

Ecco dove sostituisce assert da assertError, ma solo se le affermazioni sono abilitati. assertError è definito in GHC.IO.Exception

+1

Interessante. C'è una ragione per cui questo non può essere gestito in modo più generico? Penserei che un prgma esplicito di 'RULE' racchiuso nella magia del preprocessore che testare l'opzione ignore-afferma di GHC sarebbe più facile da seguire. – dfeuer

+2

@dfeuer Sarebbe più facile da seguire, ma ghc riscrive anche asserire a 'assertError' + informazioni sulla posizione. Un pragmatico 'RULE' non ha potuto ottenere queste informazioni sulla posizione. Non sono nemmeno sicuro che un prgma di 'RULE' possa controllare i flag di ottimizzazione di GHC. – bennofs

+1

Stavo suggerendo che la 'RULE' fosse compilata condizionalmente in base alla bandiera. Non so neanche se sia possibile, ma è il genere di cose che anche il CPP può gestire in alcuni contesti. Le informazioni sulla posizione sembrano generalmente utili, perché non una magica funzione di "localizzazione" che si espande alle informazioni sulla posizione in cui appare? – dfeuer

Problemi correlati