L'incredibile core.typed
introduce "un sistema di tipo opzionale per Clojure", come potete vedere sul loro official website.
In particolare si consiglia di utilizzare il proprio defprotocol
macro (from core.typed wiki):
Definizioni di protocolli dovrebbero usare clojure.core.typed/defprotocol cui sintassi ricorda defprotocol e fn digitato:
(defprotocol IUnifyWithLVar
(unify-with-lvar [v u :- LVar s :- ISubstitutions] :- (U ISubstitutions Fail)))
protocolli polimorfi sono supportati:
(defprotocol [a b] Lens
(-fetch [l x :- a] :- b)
(-putback [l x :- a v :- b] :- a))
Una volta installed, si esegue tramite leiningen con . Lo svantaggio evidente è che devi annotare il tuo codice. Questo è il costo da pagare per aumentare la sicurezza del codice utilizzando il controllo di tipo statico.
Potrebbero interessarti anche le funzioni satisfies?
e instance?
.
"soddisfa?" O "istanza?" Verificare che qualche interfaccia o protocollo sia implementata a fondo? Solo in combinazione con core.typed? – noisesmith
Sono cose completamente separate. 'core.typed' è un controllo di tipo, mentre gli altri due sono funzioni e devono essere richiamati in fase di esecuzione (' satisfies? 'è utile per i protocolli, non' instant? 'ma l'ho incluso per completezza). Di nuovo sono completamente indipendenti. – nha
OK, la ragione per cui lo chiedo è che nessuna di queste funzioni, per quanto ne so, dice se alcuni oggetti implementano un'interfaccia specifica o un metodo di protocollo. – noisesmith