| If you wanted to define a type-safe person struct, you could do it with: (defstruct person
(age 0 :type fixnum)
(name "" :type string)) Now every access to that person structure should be checked by the compiler. You can create a person like: (setf p (make-person :age 7 :name "fred"))
=> #S(PERSON :AGE 7 :NAME "fred") But not with:
(setf p (make-person :age 7 :name 8)) which causes SBCL to error with:
The value 8 is not of type STRING.
[Condition of type TYPE-ERROR] Equally, if you tried wrongly to define (defun print-hello (person)
(let ((name (string-upcase (person-age person))))
(format t "Hallo ~a!~%" name))) You get at least a warning you should heed:
; caught WARNING:
; Asserted type (OR (VECTOR CHARACTER) (VECTOR NIL) BASE-STRING SYMBOL CHARACTER)
; conflicts with derived type (VALUES FIXNUM &OPTIONAL). So, for refactoring, you would change the type signatures of your struct and then recompile all code to see whether the compiler generates errors/warnings. |