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

From: David Ponce <[email-masked]>
Date: Sun, 27 Apr 2025 17:31:39 +0200

On 2025-04-27 14:59, Stefan Monnier wrote:
>>> Exactly, I fully agree, the question is "how to keep track of the
>>> children"?
>>
>> You could approximate it with `after-load-functions`.  Or, with the
>> proposed patch, you could use an advice on `cl--type-deftype`.  Once you
>> do that, you won't need to break circularity in `cl-types-of`.
> 
> I think what I was trying to say all along is:
> the circularity you're trying to break doesn't come from `cl-deftype` or
> `cl-types-of` but from your impredicative definition of `T1`.
> So it'd be best to fix it there:
> 
>      (cl-deftype T1 ()
>        `(satisfies ,(lambda (o) (memq 'T1 (cl-types-of o)))))
> 
> =>
> 
>      (defvar my-pending-T1-check (make-symbol "void"))
> 
>      (cl-deftype T1 ()
>        `(satisfies
>          ,(lambda (o)
>             (and (not (eq o my-pending-T1-check))
>                  (let ((my-pending-T1-check o))
>                    (memq 'T1 (cl-types-of o)))))))
> 

Hi Stefan,

I quite like this approach, where it's not `cl-types-of', but each type
that bears responsibility for its implementation.

So, if I understand correctly, your recommendation is to not try to solve
recursion (or other) problems in `cl-types-of' at all, but rather at the
level of each type's definition, and to let ill-defined types possibly
cause errors?

The only point that still bothers me is not protecting `cl-types-of' from
errors due to ill-defined types.  This is particularly true because this
can impact the entire Emacs session if certain methods are prevented from
working, such as those involved in the display process (I use such methods
based on `cl-deftype' for example, in my own alternative implementation of
icons and tab-line).

If you agree I will update cl-types.el accordingly and dispatch it in
the existing libraries according to your previous proposal... to see what
happens ;-)

Thanks again for being so helpful!

David