Lisp's type system is fine.
(defstruct adult (name 'error :type string) (age 'error :type (integer 18 200)))
* (make-adult :name "Bob" :age 3)
debugger invoked on a TYPE-ERROR @5529ACEE in thread
#<THREAD tid=426288 "main thread" RUNNING {1003F000A3}>:
The value
3
is not of type
(INTEGER 18 200)
when setting slot AGE of structure ADULT
* (make-adult :age 18)
debugger invoked on a TYPE-ERROR @5529ACF2 in thread
#<THREAD tid=426288 "main thread" RUNNING {1003F000A3}>:
The value
ERROR
is not of type
STRING
when setting slot NAME of structure ADULT