Giorno. Approccio interessante per static typing in Clojure https://github.com/arohner/spectrum
Non ne abuserei (non mi piace l’idea di avere specs su ogni funzione). Vorrei capire se posso limitarmi a scrivere specs solo per la parte pubblica di un namespace, oppure se sarei costretto a farlo su tutte le funzioni.
fico, che differenza c’e’ tra test.check
e questa lib? :thinking_face:
ciao @reborg se ho capito bene in quel progetto dovresti poter scrivere spec solo per una parte delle tue funzioni. Detto cio', non l'ho ancora usata, quindi se la usi tienimi aggiornato. Altre cose simili sono guardrails
e https://www.fulcrologic.com/copilot (evoluzione commerciale di guardrails
sempre dell'autore di fulcro
)
@imparato.andrea test.check
e' property base testing, cioe' genera valori on demand (e magari controlla che soddisfino delle proprieta'). spectrum
vorrebbe essere un tool di analisi statica (quindi non a run-time) che controlla le spec
@reborg io per ora sto usando guardrails
pero' pagherei per un buon tool di analisi statica
> Altre cose simili sono guardrails e https://www.fulcrologic.com/copilot (evoluzione commerciale di guardrails sempre dell’autore di fulcro) > @reborg io per ora sto usando guardrails pero’ pagherei per un buon tool di analisi statica (edited) Si non ho nessuna esperienza con Spectrum in particolare (che e’ ancora molto sperimentale). Sembra che il maggior beneficio al momento, sarebbe per situazioni dove si fa uso di spec annotations e vuoi capire a compile time se le specs che hai scritto hanno senso tra di loro. Sembra molto simile a Copilot come approccio: evitare di decorare tutto con specs e fare una parte di inference guardando al codice che hai scritto.
cosa usi tu per controllare le spec @reborg?
niente di speciale, principalmente unit testing
oggi ho scoperto che non posso usare spec con defprotocol
😄
il workaround (non ideale) pare che sia https://groups.google.com/g/clojure/c/f068WTgakpk/m/DpucRRYTBQAJ
Il problema di quella soluzione e' che ti perdi il vantaggio dell'aver introdotto un'interfaccia al tuo namespace
perche' chiamo foo
che non e' parte del protocollo