3 ms·
Clojure.spec is very clever, but it can be exactly duplicated in a statically-typed language by unit or property testing. It doesn't bring anything to the table
by yawaramin 9y ago
Clojure.spec is very clever, but it can be exactly duplicated in a statically-typed language by unit or property testing. It doesn't bring anything to the table that is totally a superset of static typing.
> In such a case, the line between these two type environments narrows.
Not really. Static types still offer you total proofs of the properties you encode as types, not just experimental results of tests.
- hellofunk 9y agoGenerative testing is just one application of Clojure.spec. It does more than just aid in testing. It doubles as a runtime contract system, a data coercion system, and some folks are using it for compile-time checks as well (not in the testing sense, though I haven't read up on how they are doing that). It is not a proof-like system, but outside of dependent typing, static typing does not catch value-related bugs, but Clojure.spec can. In a static type system, how easily would it be to exactly specify and guarantee that a function's second parameter is of a higher value than its first, or that a function's output is an integer between 5 and 50, etc? Clojure.spec is just predicate functions composed together to define the flow of data in a program, and those compositions can be used in a variety of ways.
- yawaramin 9y ago> ... static typing does not catch value-related bugs, but Clojure.spec can. Can you provide an example? > In a static type system, how easily would it be to exactly specify and guarantee that a function's second parameter is of a higher value than its first, or that a function's output is an integer between 5 and 50, etc? Scala: def foo(param1: Int, param2: Int): Int = { require(param2 > param1, "Param2 must > param1") param2 - param1 ensuring { result => result >= 5 && result <= 50 } }