2 ms·
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
by _ph_ 10y ago
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.
- muflax 10y agoThanks! I vaguely remembered there being some problems with that, but playing around with it, it works fine and as I'd expect. Sweet! Gotta revisit CL soon then.