2014-04-10 14 views

Antwort

8

Der Kommentar über dieser Funktion gibt einen Hinweis:

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

Also, nur Github-Suche verwenden und für assertError suchen: RnExpr.lhssearch results

Dies taucht die Datei. Die Suche nach assert in dieser Datei finden Sie den folgenden Code finden:

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) } } 

Das ist, wo es assert von assertError ersetzt, aber nur, wenn Behauptungen sind aktiviert. assertError ist definiert in GHC.IO.Exception

+1

Interessant. Gibt es einen Grund, warum dies nicht generischer gehandhabt werden kann? Ich würde denken, dass ein explizites 'RULE'-Pragma, das in Präprozessor-Magie eingepackt ist, die für die GHC-Option ignore-assets testet, einfacher zu folgen wäre. – dfeuer

+2

@dfeuer Das wäre einfacher zu folgen, aber ghc schreibt auch Assert zu 'assertError' + Ortsinformation. Ein 'RULE'-Pragma konnte diese Standortinformationen nicht erhalten. Ich bin nicht einmal sicher, ob ein 'RULE'-Pragma nach GHC-Optimierungsflags suchen kann. – bennofs

+1

Ich habe vorgeschlagen, dass die 'RULE' basierend auf der Flagge bedingt kompiliert werden. Ich weiß nicht, ob das auch möglich ist, aber es ist etwas, das selbst CPP in einigen Kontexten bewältigen kann. Standortinformationen erscheinen im Allgemeinen nützlich - warum nicht eine magische "Standort" -Funktion, die zu Informationen über den Ort erweitert wird, in dem sie erscheint? – dfeuer

Verwandte Themen