4.3 Predicating Type Specifiers

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.

It is not a good idea for a predicate appearing in a satisfies type specifier to cause any side effects when invoked.