http://hackage.haskell.org/package/base-4.6.0.1/docs/src/GHC-Base.html#assert sembra definire assert
un no-op. Dov'è la logica che trasforma questo in qualcos'altro quando le asserzioni sono abilitate?Dove sono le regole magiche per GHC asserire?
risposta
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
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
@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
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
- 1. Le regole di riscrittura GHC sanno riconoscere lo zucchero sintattico?
- 2. Dove posso trovare le definizioni delle regole per "eslint: consigliato"?
- 3. quali sono le regole per gli spazi in swift
- 4. Aggiunta messaggio per asserire
- 5. Dove sono consentite le interruzioni di riga nelle espressioni Haskell?
- 6. Asserire che due java bean sono equivalenti
- 7. Quali sono le regole per l'internamento delle stringhe di cpython?
- 8. Quali sono le regole di ritrasmissione per TCP?
- 9. Quali sono le regole per confrontare gli array numpy usando ==?
- 10. Quali sono le regole per gestire i metodi ereditati dall'omonimo?
- 11. Devo evitare le stringhe magiche possibile?
- 12. Dove sono le annotazioni JDBC4?
- 13. Dove mettere le regole CSS nel controllo personalizzato ASCX?
- 14. Dove sono stabilite le regole di relazione nei dati principali in xcode 4?
- 15. Quali sono le regole dell'aritmetica modulare in C?
- 16. dove mettere le regole del formato dell'ora in Rails 3?
- 17. Quali sono le regole di visibilità per Vals a Scala per-comprensioni
- 18. I parametri impliciti sono una difficoltà per l'inlining in GHC?
- 19. Dove sono memorizzate le variabili in Python?
- 20. Dove sono le mie gemme di rubino?
- 21. Dove sono le grammatiche dell'albero in ANTLR4?
- 22. Che cosa sono le regole molto inefficienti in css
- 23. Quali sono le regole di pluralizzazione Mongoose (Nodejs)?
- 24. Quali sono le regole sull'accesso simultaneo a un database persistente
- 25. dove sono le linee guida per il layout di iOS?
- 26. Dove sono i test unitari per le classi Java "native"?
- 27. Dove sono le librerie di Erlang?
- 28. Dove sono le mie lezioni di System.Management. *?
- 29. Dove sono archiviate le variabili locali .NET?
- 30. Linux: dove sono memorizzate le variabili d'ambiente?
È il compilatore magico come 'pigro' e' punto di interruzione'. Probabilmente c'è un caso speciale in GHC per questo. – jozefg