http://hackage.haskell.org/package/base-4.6.0.1/docs/src/GHC-Base.html#assert scheint zu definieren assert
zu einem No-Op. Wo ist die Logik, die dies zu etwas anderem macht, wenn Behauptungen aktiviert sind?Wo sind die magischen Regeln für GHC?
Antwort
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
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
@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
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
- 1. Was sind die Regeln für Räume in swift
- 2. Was sind die Regeln für die Iterator-Invalidierung?
- 3. Was sind die Regeln für modulare Arithmetik in C?
- 4. Wo sind die VBProjectsEvents?
- 5. Wo sind die Ressourcen für Locales gespeichert?
- 6. Wo sind die Javadocs für Lotus Notes.jar?
- 7. Was sind die standardmäßigen CKEditor ACF-Regeln für den Inhaltsinhalt?
- 8. Was sind die Regeln für benannte Argumente und warum?
- 9. Sind GHC Typ Famlies ein Beispiel für System F-Omega?
- 10. Wo sind die Cocoa Keycodes?
- 11. Welche Pakete sind in GHC fest verdrahtet?
- 12. Wo sind die Inodes gespeichert?
- 13. WPFToolkit.Extended - wo sind die Werkzeuge?
- 14. Sind implizite Parameter eine Schwierigkeit beim GHC?
- 15. Was genau sind GHC-Typ-Koerzitien?
- 16. Sind Firebase Bolt-Regeln veraltet?
- 17. Wo sollte ich den magischen Kommentar der lexikalischen Bindung hinzufügen?
- 18. Wo sind die CommonJS-Module?
- 19. Wo sind die Erlang-Bibliotheken?
- 20. Wo sind die Properties.Settings.Default gespeichert?
- 21. Was die Scoping-Regeln für vals in Scala für-Comprehensions sind
- 22. Globale Konfiguration für GHC-Buildflags
- 23. Tipp für "andere" in magischen Methoden?
- 24. Wie schreiben Sie Rewrite-Regeln für Typklassenmethoden?
- 25. Problemumgehung für Firebases "Regeln sind keine Filter" Einschränkung
- 26. Wo sind die Live-Vorlagen für Java in Intellij-IDEA?
- 27. Wo sind die Archive für OS X Server Bots gespeichert
- 28. css: Wo sind die weißen Hintergrundrahmen für Textfelder?
- 29. Wo sind die .vssettings für Visual Studio Express?
- 30. Wo sind die besten Erklärungen zum Speichermanagement für das iPhone?
Es ist Compiler Magie wie "faul" und "Breakpoint". Wahrscheinlich gibt es dafür entweder einen speziellen Fall in GHC. – jozefg