Subject: Re: bug#77725: 31.0.50; Add support for types accepted by `cl-typep' to cl-generic?

From: Stefan Monnier <[email-masked]>
Date: Mon, 05 May 2025 23:45:47 -0400

> As mentioned in a previous message, `cl--type-flag' explored the idea of
> ​​mapping a set of cl-types to a built-in type (root-type), and its value
> allowed us to know whether the type is worth checking, i.e. either not
> yet passed a `cl-typep' in `cl-types-of', or its root-type match the
> `root-type' of the checked object:

Oh, duh!  I completely misunderstood this and confused it with a flag
that indicated the type was signaling errors.
Thanks for the heads up.

I the mean time, I pushed the branch another change which smears the
code over the various `cl-*.el` files.  It's ugly as sin, but that's the
best I could come up with.

> (cl-types-of 'button) => button match `icon' type, so the `cl--type-flag'
> of `icon' is set to `symbol' (cl-type-of or root-type of `button')
>
> (cl-types-of 12) => `root-type' of 12 is `fixnum', so cl-types-of doesn't
> waste time checking if 12 if of type `icon', because we are sure it cannot
> match (their root-types are different).  An so on with other types whose
> root-type is known.

That makes a lot of sense, indeed.
But ... does it work for:

   (cl-deftype my-pair ()
     `(and number (satisfies ,(lambda (x) (zerop (logand x 1))))))

(cl-types-of (expt 2 128)) => (expt 2 128) matches `my-pair` type, so
the `cl--type-flag` of `my-pair` is set to `bignum`.  Now when I try
(cl-types-of 4) won't it skip `my-pair` because (cl-type-of 4) is not
`bignum`?  What am I missing?

        Stefan