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

From: David Ponce <[email-masked]>
Date: Thu, 24 Apr 2025 18:34:07 +0200

On 2025-04-24 13:44, David Ponce wrote:
> On 2025-04-23 14:59, David Ponce wrote:
>>
>> While working with cl-types.el I discovered a nasty side effect
>> of byte compilation on the cl--type-list.
>>
>> I can't explain what is going on :-(
>>
>> Here is a recipe:
>>
>> - run emacs -Q
>>
>> - load cl-type.el (the last version previously attached)
>>
>> - load cl-type-recipe.el (attached)
>>
>> - In the scratch buffer eval cl--type-list.  Result is expected:
>>
>>    (cons-cdr-foo cons-car-foo)
>>
>> - Then open cl-type-recipe.el and byte-compile it with
>>    M-x emacs-lisp-byte-compile
>>
>> - Then eval again cl--type-list in the scratch buffer, and now the
>>    result is something like this:
>>
>>    (#<symbol cons-cdr-foo at 158> #<symbol cons-car-foo at 46>)
>>
>>    Which completely breaks cl-types !
>>
>> I hope you can shed some light on what is going on here.
>>
>> Thanks!
>>
> 
> It seems the side effect is more general than just with cl-type.el.
> 
> I attached cl-type-recipe2.el, another simple recipe to illustrate with
> current `cl-deftype'.
> 
> - Run emacs -Q and load cl-type-recipe2.el.
> - Then in the scratch buffer eval:
> 
> (symbol-plist 'cons-car-foo)
> => (cl-deftype-handler #[nil ((list 'satisfies #'(lambda (x) (eq (car-safe x) 'foo)))) (t) nil "A cons with a `foo' car."])
> 
> - Then open cl-type-recipe2.el and M-x emacs-lisp-byte-compile
> 
> - Then in the scratch buffer eval again:
> 
> (symbol-plist 'cons-car-foo)
> => (cl-deftype-handler #[nil (`(#<symbol satisfies at 113> ,(#<symbol lambda at 125> (x) (#<symbol eq at 137> (#<symbol car-safe at 141> #<symbol x at 150>) '#<symbol foo at 154>)))) (t) nil "A cons with a `foo' car."])
> 
> And, of course:
> 
> (cl-typep '(foo) 'cons-car-foo)
> => (invalid-function #<symbol lambda at 125>)
> 
> Without compile in the `cl-eval-when' in `cl-deftype', there is no side effect.
> 
> Hope it will help.
> 
> David

Another information which could be useful: if I replace (cl-eval-when (compile load eval) ...)
by (eval-and-compile ...) in the definition of `cl-deftype', there is no side effect
of the byte-compilation on the current definition.

What I don't know is if the two forms are equivalent.