GNU bug report logs - #77725
31.0.50; Add support for types accepted by `cl-typep' to cl-generic?

Previous Next

Package: emacs;

Reported by: David Ponce <da_vid <at> orange.fr>

Date: Fri, 11 Apr 2025 07:16:01 UTC

Severity: normal

Found in version 31.0.50

Full log


View this message in rfc822 format

From: David Ponce <da_vid <at> orange.fr>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 77725 <at> debbugs.gnu.org, Eli Zaretskii <eliz <at> gnu.org>
Subject: bug#77725: 31.0.50; Add support for types accepted by `cl-typep' to cl-generic?
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.






This bug report was last modified 11 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.