Common Lisp the Language, 2nd Edition
A type specifier list (satisfies predicate-name) denotes the set of all objects that satisfy the predicate named by predicate-name, which must be a symbol whose global function definition is a one-argument predicate. (A name is required; lambda-expressions are disallowed in order to avoid scoping problems.) For example, the type (satisfies numberp) is the same as the type number. The call (typep x '(satisfies p)) results in applying p to x and returning t if the result is true and nil if the result is false.
As an example, the type string-char could be defined as
(deftype string-char () '(and character (satisfies string-char-p)))
See deftype.
X3J13 voted in March 1989 (COMMON-TYPE) to remove the type string-char
and the function string-char-p from the language.
It is not a good idea for a predicate appearing in a satisfies type specifier to cause any side effects when invoked.