Take for example a trivial example when we need to validate user data with the following constraints:
- Age: Must be between 18 and 120.
- Name: Must be a non-empty string.
- Email: Must follow a valid email format.
- Credit Card Number: Must pass the Luhn algorithm check.
Something like that is pretty straightforward to achieve in Clojure.spec within 20 lines of code. It's close to impossible to get with any advanced static type system, because type systems can't deal well with custom constraints; they often can't offer detailed, human-readable error messages for the cases like that; they often can't describe complex and nested data structures, or trying to do so would be cumbersome and less expressive.
So, they are not types. Okay. Cisco built their cybersecurity platform using Clojure. The market capitalization is about $180B. I imagine this would be a few dozen billions more if they had chosen to use an "actual type system", amiright?
----
edit: After thinking about it a bit more, I have to admit that I spoke too harshly. It's not "close to impossible" You probably can create a type that checks for these constraints, but you would likely need to use a dependent type system or refined types, perhaps something like LiquidHaskell., and it still would be very tricky, especially with the credit card part. In Clojure.spec - it's very trivial.
For example... one can easily express all that in Common Lisp:
https://www.lispworks.com/documentation/HyperSpec/Body/04_b....
CL-USER 9 > (defun non-empty-string-p (string) (and (stringp string) (plusp (length string))))
NON-EMPTY-STRING-P
CL-USER 10 > (deftype name-type () `(and string (satisfies non-empty-string-p)))
NAME-TYPE
CL-USER 11 > (deftype age-type () `(integer 18 120))
AGE-TYPE
CL-USER 12 > (defun foo (age name)
(declare (type age-type age)
(type name-type name))
(print (list age name)))
FOO
also, avoiding SATISFIES: CL-USER 4 > (deftype name-type () `(and string (not (string 0))))
NAME-TYPE
CL-USER 5 > (typep "hello" 'name-type)
T
CL-USER 6 > (typep "" 'name-type)
NIL
It then has assertions integrated with the condition system, which makes this easily checkable at runtime.SBCL has this extended with type declarations as assertions: http://sbcl.org/manual/index.html#Handling-of-Types
Eiffel had promoted Design by Contract for a long time.
> Cisco built their cybersecurity platform using Clojure.
Cisco uses a lot of software. Your Clojure marketing attempts are getting silly.