From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: akater Newsgroups: gmane.emacs.bugs Subject: bug#47327: 28.0.50; (cl-generic) eql specializer not evaluated Date: Tue, 20 Jul 2021 02:28:12 +0000 Message-ID: <87h7gpoh1f.fsf@gmail.com> References: <87k0pz5d6u.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="3304"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 47327@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue Jul 20 04:40:11 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1m5fg3-0000gb-9M for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 20 Jul 2021 04:40:11 +0200 Original-Received: from localhost ([::1]:56034 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m5fg1-0007mM-C3 for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 19 Jul 2021 22:40:09 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:40258) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m5ffu-0007lz-73 for bug-gnu-emacs@gnu.org; Mon, 19 Jul 2021 22:40:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:49156) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1m5fft-000739-VQ for bug-gnu-emacs@gnu.org; Mon, 19 Jul 2021 22:40:01 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1m5fft-0000z5-T0 for bug-gnu-emacs@gnu.org; Mon, 19 Jul 2021 22:40:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: akater Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 20 Jul 2021 02:40:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 47327 X-GNU-PR-Package: emacs Original-Received: via spool by 47327-submit@debbugs.gnu.org id=B47327.16267487743722 (code B ref 47327); Tue, 20 Jul 2021 02:40:01 +0000 Original-Received: (at 47327) by debbugs.gnu.org; 20 Jul 2021 02:39:34 +0000 Original-Received: from localhost ([127.0.0.1]:60694 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1m5ffR-0000xx-0N for submit@debbugs.gnu.org; Mon, 19 Jul 2021 22:39:34 -0400 Original-Received: from mail-ej1-f41.google.com ([209.85.218.41]:37435) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1m5ffO-0000xg-O6 for 47327@debbugs.gnu.org; Mon, 19 Jul 2021 22:39:32 -0400 Original-Received: by mail-ej1-f41.google.com with SMTP id hc15so32058856ejc.4 for <47327@debbugs.gnu.org>; Mon, 19 Jul 2021 19:39:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:in-reply-to:references:date:message-id :mime-version; bh=VOq0A4/RXEL4cfU97IkNbEBB0ZU/fWk1ad5foLWW8rA=; b=cslnRChRJpvJHAtsxQrY3TyzbRYd63CGk/Lvkp+RUWG0AskYKp88c71cxqxykLkBXc 49MpBct11DNPV6YKJkK+tADzxD8/oB/qNhQVApP52eThunCuc+BSZodmD8payjvqQmdD UUVhYIBFBTrnO69ylyMg1CMoUn0vILtUDYpGkRKz6dvimA1xnEKy3s460sMycjRhJyiv zSe+5sy/u2vrtge2MMHRUnovLf1foAjCxvOyGQHgqG0d8faSn7fZQsQq+MzshRfAdBMI TRdUOqNF3KzqvcdF05rWKwmPArHj3QTQms/QHEL/6YccmzDka35inogSy2LacLotAvYl F4WA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:in-reply-to:references:date :message-id:mime-version; bh=VOq0A4/RXEL4cfU97IkNbEBB0ZU/fWk1ad5foLWW8rA=; b=broHy6GQv9/acwQtxk6a0IpwR0yWIy6FgagT5VWt+Ub4ldLDV0qWZeBR8Y6sKeOa8U Nool7IWcxnDhzM6jila9OMU9HcBAM5mUnA7D4HVtSKPd4aDl4W7Vrzjs2Qd5r9nmC8lg CqEnnHF2Lchi9fIQcLk7ATh14Axu/xOWFCvy1mY7OnGhH8Ma0zGbk0yqG77wyQjFnD6F MpbDjfWT7jxHUFzANtW5+9LKawgxPB+ZFK8I0D8JXhUoF1l9WSyG9/OqmdybZ+3vXjL9 SwcW73f8FzSpc8kgWI9JkPj7eYD2ybQrKqMwgJjv1qGPijo68y7K2wFTbm75AFV4rR8Q xpBQ== X-Gm-Message-State: AOAM5326QoR1HeJ+QKcbnzhPl6QtXiXErFoBROgqXY+ETclqziaPBezS /WOlQZs1+4No3/9AKMRdYis= X-Google-Smtp-Source: ABdhPJyLNU9CItHvhLcDx2OEEdjW1MROL0dFjS5emMxXHIQY803QKJjOwB1CJ2JJDGtwENGy4SzZmg== X-Received: by 2002:a17:906:7111:: with SMTP id x17mr30089798ejj.294.1626748764865; Mon, 19 Jul 2021 19:39:24 -0700 (PDT) Original-Received: from localhost ([5.104.110.89]) by smtp.googlemail.com with ESMTPSA id z5sm6561843ejn.65.2021.07.19.19.39.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jul 2021 19:39:24 -0700 (PDT) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:210320 Archived-At: --=-=-= Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Stefan Monnier writes: > Could you check to see which code would break if we made this change? I looked for =E2=80=9C(eql=E2=80=9D and then for =E2=80=9Ccl-defmethod=E2= =80=9D, searching for generated code specifically. Unless there's less obvious code that generates cl-defmethod forms, it should all be in the attached patch. > (cl-defmethod cl-generic-generalizers ((specializer (head eql))) > "Support for (eql VAL) specializers. > These match if the argument is `eql' to VAL." > - (puthash (cadr specializer) specializer cl--generic-eql-used) > + (let ((form (cadr specializer))) > + (puthash (if (or (not (symbolp form)) (macroexp-const-p form)) > + (eval form t) > + (message "Quoting obsolete `eql' form: %S" specializer) > + form) > + specializer cl--generic-eql-used)) > (list cl--generic-eql-generalizer)) Which implies, those who want to specialize on a value of symbol x should write (eql (symbol-value 'x)), right? This irregularity better be pointed out somewhere; I rarely read Elisp manual so I'm not sure if it would be appropriate there. Otherwise, looks good, provided that it works. (JFYI, I don't think I will be able to properly test this patch soon enough.) Please note that there are two spots in the patch where I'm not sure what (if anything) should be done; marked with WARNING. --==-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQJLBAEBCgA1FiEEgu5SJRdnQOF34djNsr6xYbHsf0QFAmD2NL4XHG51Y2xlYXJz cGFjZUBnbWFpbC5jb20ACgkQsr6xYbHsf0R5gw/+OC2gtSwFOT1XIJYOCkGioVJ5 BUOqk73PUBZ6AVI4x66qlMaA+lTJWoSFawhYh3j5isli6Jb/cBT50OEodICcEIh8 N2JyVOWonuCKN+TcoKkQmM6sn5kl/lMUSaBx807W2r0wdm/TYr+ngBBw0cCEYKnS Z7X/vxxnDdUGINV0G87F0HABJCzYxs4Zihc55DoSux9tHHaX9W1PMFcKOurXhy+k h91HUFYXtI+6AyXYQgVAFo25RRwVtwNDP4nD8t18/Sd1JNJoSCjC1XBtS7nx9gg0 YaqzOiv4DQkbNbprl/Z+ORGY7E1kvi7c36+p5ZLGwi/G6N93YJM1jIez85AaHRbz 6c3zXY69z040x5LzuWgTUsNY1DtZwAPJxs7Oh8/XEQRcK3uVNgUtWzX//rLdRn94 q5bFE4qikBxOxfi/Lcsx7slzFna44WLwlOOWzxt3l16Jj+U0sBRW+7lg5eX6Wtxb 8uSKp2G+E1MmNXKOfp8ts8yef58twIc3hl8ftrRcmHp2guWeaOihsNDIOFv2B40e wk+pldQhxRILGwtwNqxwdEZgd9Cvk+nWrSh8X/ihRogVqMhvmHXvGVOFUQ88++8v DpfFBK4IV0NL4hWGBjvrUeCQLoW3xRxAruhh3ce/XLh3xBHSNH3EnYDp2qSHBust UhH55Wf0erkBOo99vrs= =lPP1 -----END PGP SIGNATURE----- --==-=-=-- --=-=-= Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename=0001-Upcoming-changes-to-eql-specializer-use.patch Content-Transfer-Encoding: quoted-printable Content-Description: Necessary changes in eql specializer use >From 3d1463c9238ac9d0c246e9bbb769331a2d16ab8f Mon Sep 17 00:00:00 2001 From: akater Date: Tue, 20 Jul 2021 01:25:01 +0000 Subject: [PATCH] Upcoming changes to eql specializer use --- lisp/emacs-lisp/bindat.el | 24 ++++++++++++------------ lisp/emacs-lisp/cl-generic.el | 5 +++++ lisp/emacs-lisp/edebug.el | 18 +++++++++--------- lisp/emacs-lisp/map.el | 8 ++++---- lisp/emacs-lisp/radix-tree.el | 2 +- lisp/frame.el | 6 +++++- lisp/gnus/gnus-search.el | 2 +- lisp/image/image-converter.el | 12 ++++++------ lisp/mail/smtpmail.el | 6 +++--- lisp/progmodes/elisp-mode.el | 7 ++++--- lisp/progmodes/etags.el | 12 +++++++----- test/lisp/emacs-lisp/checkdoc-tests.el | 8 ++++---- 12 files changed, 61 insertions(+), 49 deletions(-) diff --git a/lisp/emacs-lisp/bindat.el b/lisp/emacs-lisp/bindat.el index 247fb91379..76c2e80fda 100644 --- a/lisp/emacs-lisp/bindat.el +++ b/lisp/emacs-lisp/bindat.el @@ -657,33 +657,33 @@ defmacro bindat--pcase (&rest args) OP can be one of: unpack', (pack VAL), or (length VAL) where VAL is the name of a variable that will hold the value we need to pack.") =20 -(cl-defmethod bindat--type (op (_ (eql byte))) +(cl-defmethod bindat--type (op (_ (eql 'byte))) (bindat--pcase op ('unpack `(bindat--unpack-u8)) (`(length . ,_) `(cl-incf bindat-idx 1)) (`(pack . ,args) `(bindat--pack-u8 . ,args)))) =20 -(cl-defmethod bindat--type (op (_ (eql uint)) n) +(cl-defmethod bindat--type (op (_ (eql 'uint)) n) (if (eq n 8) (bindat--type op 'byte) (bindat--pcase op ('unpack `(bindat--unpack-uint ,n)) (`(length . ,_) `(cl-incf bindat-idx (/ ,n 8))) (`(pack . ,args) `(bindat--pack-uint ,n . ,args))))) =20 -(cl-defmethod bindat--type (op (_ (eql uintr)) n) +(cl-defmethod bindat--type (op (_ (eql 'uintr)) n) (if (eq n 8) (bindat--type op 'byte) (bindat--pcase op ('unpack `(bindat--unpack-uintr ,n)) (`(length . ,_) `(cl-incf bindat-idx (/ ,n 8))) (`(pack . ,args) `(bindat--pack-uintr ,n . ,args))))) =20 -(cl-defmethod bindat--type (op (_ (eql str)) len) +(cl-defmethod bindat--type (op (_ (eql 'str)) len) (bindat--pcase op ('unpack `(bindat--unpack-str ,len)) (`(length . ,_) `(cl-incf bindat-idx ,len)) (`(pack . ,args) `(bindat--pack-str ,len . ,args)))) =20 -(cl-defmethod bindat--type (op (_ (eql strz)) &optional len) +(cl-defmethod bindat--type (op (_ (eql 'strz)) &optional len) (bindat--pcase op ('unpack `(bindat--unpack-strz ,len)) (`(length ,val) @@ -701,25 +701,25 @@ defmacro bindat--pcase (&rest args) (bindat--pack-str ,len . ,args) (bindat--pack-strz . ,args)))))) =20 -(cl-defmethod bindat--type (op (_ (eql bits)) len) +(cl-defmethod bindat--type (op (_ (eql 'bits)) len) (bindat--pcase op ('unpack `(bindat--unpack-bits ,len)) (`(length . ,_) `(cl-incf bindat-idx ,len)) (`(pack . ,args) `(bindat--pack-bits ,len . ,args)))) =20 -(cl-defmethod bindat--type (_op (_ (eql fill)) len) +(cl-defmethod bindat--type (_op (_ (eql 'fill)) len) `(progn (cl-incf bindat-idx ,len) nil)) =20 -(cl-defmethod bindat--type (_op (_ (eql align)) len) +(cl-defmethod bindat--type (_op (_ (eql 'align)) len) `(progn (cl-callf bindat--align bindat-idx ,len) nil)) =20 -(cl-defmethod bindat--type (op (_ (eql type)) exp) +(cl-defmethod bindat--type (op (_ (eql 'type)) exp) (bindat--pcase op ('unpack `(funcall (bindat--type-ue ,exp))) (`(length . ,args) `(funcall (bindat--type-le ,exp) . ,args)) (`(pack . ,args) `(funcall (bindat--type-pe ,exp) . ,args)))) =20 -(cl-defmethod bindat--type (op (_ (eql vec)) count &rest type) +(cl-defmethod bindat--type (op (_ (eql 'vec)) count &rest type) (unless type (setq type '(byte))) (let ((fun (macroexpand-all (bindat--fun type) macroexpand-all-environme= nt))) (bindat--pcase op @@ -743,10 +743,10 @@ defmacro bindat--pcase (&rest args) `(dotimes (bindat--i ,count) (funcall ,fun (elt ,val bindat--i))))))) =20 -(cl-defmethod bindat--type (op (_ (eql unit)) val) +(cl-defmethod bindat--type (op (_ (eql 'unit)) val) (pcase op ('unpack val) (_ nil))) =20 -(cl-defmethod bindat--type (op (_ (eql struct)) &rest args) +(cl-defmethod bindat--type (op (_ (eql 'struct)) &rest args) (apply #'bindat--type op args)) =20 (cl-defmethod bindat--type (op (_ (eql :pack-var)) var &rest fields) diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el index 544704be38..8250d62bbe 100644 --- a/lisp/emacs-lisp/cl-generic.el +++ b/lisp/emacs-lisp/cl-generic.el @@ -1269,6 +1269,11 @@ defun cl--generic-derived-specializers (mode &rest _) (cl-generic-define-context-rewriter major-mode (mode &rest modes) `(major-mode ,(if (consp mode) ;;E.g. could be (eql ...) + ;; WARNING: unsure whether this + ;; =E2=80=9Ccould be (eql ...)=E2=80=9D commentary (or= code) + ;; should be adjusted + ;; following the (planned) changes to eql specializer. + ;; Bug #47327 (progn (cl-assert (null modes)) mode) `(derived-mode ,mode . ,modes)))) =20 diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index 2aec8197dc..7def9ff96a 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -1731,7 +1731,7 @@ defun edebug-match-form (cursor) =20 (defsubst edebug-match-body (cursor) (edebug-forms cursor)) =20 -(cl-defmethod edebug--match-&-spec-op ((_ (eql &optional)) cursor specs) +(cl-defmethod edebug--match-&-spec-op ((_ (eql '&optional)) cursor specs) ;; Keep matching until one spec fails. (edebug-&optional-wrapper cursor specs #'edebug-&optional-wrapper)) =20 @@ -1755,7 +1755,7 @@ defun edebug-&optional-wrapper (cursor specs remainde= r-handler) "Handle &foo spec operators. &foo spec operators operate on all the subsequent SPECS.") =20 -(cl-defmethod edebug--match-&-spec-op ((_ (eql &rest)) cursor specs) +(cl-defmethod edebug--match-&-spec-op ((_ (eql '&rest)) cursor specs) ;; Repeatedly use specs until failure. (let (edebug-best-error edebug-error-point) @@ -1768,7 +1768,7 @@ defun edebug-&optional-wrapper (cursor specs remainde= r-handler) (edebug-&optional-wrapper c (or s specs) rh))))) =20 =20 -(cl-defmethod edebug--match-&-spec-op ((_ (eql &or)) cursor specs) +(cl-defmethod edebug--match-&-spec-op ((_ (eql '&or)) cursor specs) ;; Keep matching until one spec succeeds, and return its results. ;; If none match, fail. ;; This needs to be optimized since most specs spend time here. @@ -1792,7 +1792,7 @@ defun edebug-&optional-wrapper (cursor specs remainde= r-handler) (apply #'edebug-no-match cursor "Expected one of" original-specs)) )) =20 -(cl-defmethod edebug--match-&-spec-op ((_ (eql &interpose)) cursor specs) +(cl-defmethod edebug--match-&-spec-op ((_ (eql '&interpose)) cursor specs) "Compute the specs for `&interpose SPEC FUN ARGS...'. Extracts the head of the data by matching it against SPEC, and then matches the rest by calling (FUN HEAD PF ARGS...) @@ -1817,7 +1817,7 @@ defun edebug-&optional-wrapper (cursor specs remainde= r-handler) (append instrumented-head (edebug-match cursor newspec= s))) ,@args)))) =20 -(cl-defmethod edebug--match-&-spec-op ((_ (eql ¬)) cursor specs) +(cl-defmethod edebug--match-&-spec-op ((_ (eql '¬)) cursor specs) ;; If any specs match, then fail (if (null (catch 'no-match (let ((edebug-gate nil)) @@ -1829,7 +1829,7 @@ defun edebug-&optional-wrapper (cursor specs remainde= r-handler) ;; This means nothing matched, so it is OK. nil) ;; So, return nothing =20 -(cl-defmethod edebug--match-&-spec-op ((_ (eql &key)) cursor specs) +(cl-defmethod edebug--match-&-spec-op ((_ (eql '&key)) cursor specs) ;; Following specs must look like ( ) ... ;; where is the name of a keyword, and spec is its spec. ;; This really doesn't save much over the expanded form and takes time. @@ -1842,7 +1842,7 @@ defun edebug-&optional-wrapper (cursor specs remainde= r-handler) (car (cdr pair)))) specs)))) =20 -(cl-defmethod edebug--match-&-spec-op ((_ (eql &error)) cursor specs) +(cl-defmethod edebug--match-&-spec-op ((_ (eql '&error)) cursor specs) ;; Signal an error, using the following string in the spec as argument. (let ((error-string (car specs)) (edebug-error-point (edebug-before-offset cursor))) @@ -1942,7 +1942,7 @@ defun edebug-match-nil (cursor) (defun edebug-match-function (_cursor) (error "Use function-form instead of function in edebug spec")) =20 -(cl-defmethod edebug--match-&-spec-op ((_ (eql &define)) cursor specs) +(cl-defmethod edebug--match-&-spec-op ((_ (eql '&define)) cursor specs) ;; Match a defining form. ;; Normally, &define is interpreted specially other places. ;; This should only be called inside of a spec list to match the remaind= er @@ -1958,7 +1958,7 @@ defun edebug-match-function (_cursor) ;; Stop backtracking here (Bug#41988). (setq edebug-gate t))) =20 -(cl-defmethod edebug--match-&-spec-op ((_ (eql &name)) cursor specs) +(cl-defmethod edebug--match-&-spec-op ((_ (eql '&name)) cursor specs) "Compute the name for `&name SPEC FUN` spec operator. =20 The full syntax of that operator is: diff --git a/lisp/emacs-lisp/map.el b/lisp/emacs-lisp/map.el index 5c76fb9eb9..c59342875d 100644 --- a/lisp/emacs-lisp/map.el +++ b/lisp/emacs-lisp/map.el @@ -407,15 +407,15 @@ defun map-merge-with (type function &rest maps) "Convert MAP into a map of TYPE.") =20 ;; FIXME: I wish there was a way to avoid this =CE=B7-redex! -(cl-defmethod map-into (map (_type (eql list))) +(cl-defmethod map-into (map (_type (eql 'list))) "Convert MAP into an alist." (map-pairs map)) =20 -(cl-defmethod map-into (map (_type (eql alist))) +(cl-defmethod map-into (map (_type (eql 'alist))) "Convert MAP into an alist." (map-pairs map)) =20 -(cl-defmethod map-into (map (_type (eql plist))) +(cl-defmethod map-into (map (_type (eql 'plist))) "Convert MAP into a plist." (let (plist) (map-do (lambda (k v) (setq plist `(,v ,k ,@plist))) map) @@ -510,7 +510,7 @@ defun map--into-hash (map keyword-args) map) ht)) =20 -(cl-defmethod map-into (map (_type (eql hash-table))) +(cl-defmethod map-into (map (_type (eql 'hash-table))) "Convert MAP into a hash-table with keys compared with `equal'." (map--into-hash map (list :size (map-length map) :test #'equal))) =20 diff --git a/lisp/emacs-lisp/radix-tree.el b/lisp/emacs-lisp/radix-tree.el index fb65975350..a529ed025d 100644 --- a/lisp/emacs-lisp/radix-tree.el +++ b/lisp/emacs-lisp/radix-tree.el @@ -240,7 +240,7 @@ defun radix-tree-count (tree) (declare-function map-apply "map" (function map)) =20 (defun radix-tree-from-map (map) - ;; Aka (cl-defmethod map-into (map (type (eql radix-tree)))) ...) + ;; Aka (cl-defmethod map-into (map (type (eql 'radix-tree)))) ...) (require 'map) (let ((rt nil)) (map-apply (lambda (k v) (setq rt (radix-tree-insert rt k v))) map) diff --git a/lisp/frame.el b/lisp/frame.el index 378d7c8e5b..0c79ce4c6f 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -36,7 +36,11 @@ (cl-generic-define-context-rewriter window-system (value) ;; If `value' is a `consp', it's probably an old-style specializer, ;; so just use it, and anyway `eql' isn't very useful on cons cells. - `(window-system ,(if (consp value) value `(eql ,value)))) + `(window-system ,(if (consp value) value + ;; WARNING: unsure whether this eql expression + ;; is actually an eql specializer. + ;; Bug #47327 + `(eql ',value)))) =20 (cl-defmethod frame-creation-function (params &context (window-system nil)) ;; It's tempting to get rid of tty-create-frame-with-faces and turn it i= nto diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el index 39bde837b3..53af2f6fe6 100644 --- a/lisp/gnus/gnus-search.el +++ b/lisp/gnus/gnus-search.el @@ -980,7 +980,7 @@ defsubst gnus-search-single-p (query) =20 ;; Most search engines use implicit ANDs. (cl-defmethod gnus-search-transform-expression ((_ gnus-search-engine) - (_expr (eql and))) + (_expr (eql 'and))) nil) =20 ;; Most search engines use explicit infixed ORs. diff --git a/lisp/image/image-converter.el b/lisp/image/image-converter.el index e47f1f76e4..97bf1ac058 100644 --- a/lisp/image/image-converter.el +++ b/lisp/image/image-converter.el @@ -133,7 +133,7 @@ defun image-converter--value (type elem) (list value) value))) =20 -(cl-defmethod image-converter--probe ((type (eql graphicsmagick))) +(cl-defmethod image-converter--probe ((type (eql 'graphicsmagick))) "Check whether the system has GraphicsMagick installed." (with-temp-buffer (let ((command (image-converter--value type :command)) @@ -151,7 +151,7 @@ defun image-converter--value (type elem) (push (downcase (match-string 1)) formats))) (nreverse formats))))) =20 -(cl-defmethod image-converter--probe ((type (eql imagemagick))) +(cl-defmethod image-converter--probe ((type (eql 'imagemagick))) "Check whether the system has ImageMagick installed." (with-temp-buffer (let ((command (image-converter--value type :command)) @@ -171,7 +171,7 @@ defun image-converter--value (type elem) (push (downcase (match-string 1)) formats))) (nreverse formats)))) =20 -(cl-defmethod image-converter--probe ((type (eql ffmpeg))) +(cl-defmethod image-converter--probe ((type (eql 'ffmpeg))) "Check whether the system has ffmpeg installed." (with-temp-buffer (let ((command (image-converter--value type :command)) @@ -212,12 +212,12 @@ defun image-converter--filter-formats (suffixes) 'image-mode) collect suffix)) =20 -(cl-defmethod image-converter--convert ((type (eql graphicsmagick)) source +(cl-defmethod image-converter--convert ((type (eql 'graphicsmagick)) source image-format) "Convert using GraphicsMagick." (image-converter--convert-magick type source image-format)) =20 -(cl-defmethod image-converter--convert ((type (eql imagemagick)) source +(cl-defmethod image-converter--convert ((type (eql 'imagemagick)) source image-format) "Convert using ImageMagick." (image-converter--convert-magick type source image-format)) @@ -249,7 +249,7 @@ defun image-converter--convert-magick (type source imag= e-format) ;; error message. (buffer-string)))) =20 -(cl-defmethod image-converter--convert ((type (eql ffmpeg)) source +(cl-defmethod image-converter--convert ((type (eql 'ffmpeg)) source image-format) "Convert using ffmpeg." (let ((command (image-converter--value type :command))) diff --git a/lisp/mail/smtpmail.el b/lisp/mail/smtpmail.el index c1e2280033..a642ff4045 100644 --- a/lisp/mail/smtpmail.el +++ b/lisp/mail/smtpmail.el @@ -574,7 +574,7 @@ defun smtpmail-try-auth-methods (process supported-exte= nsions host port (error "Mechanism %S not implemented" mech)) =20 (cl-defmethod smtpmail-try-auth-method - (process (_mech (eql cram-md5)) user password) + (process (_mech (eql 'cram-md5)) user password) (let ((ret (smtpmail-command-or-throw process "AUTH CRAM-MD5"))) (when (eq (car ret) 334) (let* ((challenge (substring (cadr ret) 4)) @@ -596,13 +596,13 @@ defun smtpmail-try-auth-methods (process supported-ex= tensions host port (smtpmail-command-or-throw process encoded))))) =20 (cl-defmethod smtpmail-try-auth-method - (process (_mech (eql login)) user password) + (process (_mech (eql 'login)) user password) (smtpmail-command-or-throw process "AUTH LOGIN") (smtpmail-command-or-throw process (base64-encode-string user t)) (smtpmail-command-or-throw process (base64-encode-string password t))) =20 (cl-defmethod smtpmail-try-auth-method - (process (_mech (eql plain)) user password) + (process (_mech (eql 'plain)) user password) ;; We used to send an empty initial request, and wait for an ;; empty response, and then send the password, but this ;; violate a SHOULD in RFC 2222 paragraph 5.1. Note that this diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index a56c7093e7..f7bc8bcd82 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -696,7 +696,7 @@ defvar elisp-xref-find-def-functions nil non-nil result supersedes the xrefs produced by `elisp--xref-find-definitions'.") =20 -(cl-defmethod xref-backend-definitions ((_backend (eql elisp)) identifier) +(cl-defmethod xref-backend-definitions ((_backend (eql 'elisp)) identifier) (require 'find-func) ;; FIXME: use information in source near point to filter results: ;; (dvc-log-edit ...) - exclude 'feature @@ -875,7 +875,7 @@ defun elisp--xref-find-definitions (symbol) =20 (declare-function xref-apropos-regexp "xref" (pattern)) =20 -(cl-defmethod xref-backend-apropos ((_backend (eql elisp)) pattern) +(cl-defmethod xref-backend-apropos ((_backend (eql 'elisp)) pattern) (apply #'nconc (let ((regexp (xref-apropos-regexp pattern)) lst) @@ -893,7 +893,8 @@ defvar elisp--xref-identifier-completion-table (facep sym))) 'strict)) =20 -(cl-defmethod xref-backend-identifier-completion-table ((_backend (eql eli= sp))) +(cl-defmethod xref-backend-identifier-completion-table ((_backend + (eql 'elisp))) elisp--xref-identifier-completion-table) =20 (cl-defstruct (xref-elisp-location diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el index f0180ceeec..ce1d8e5e62 100644 --- a/lisp/progmodes/etags.el +++ b/lisp/progmodes/etags.el @@ -2062,19 +2062,21 @@ defvar etags-xref-find-definitions-tag-order '(tag-= exact-match-p ;;;###autoload (defun etags--xref-backend () 'etags) =20 -(cl-defmethod xref-backend-identifier-at-point ((_backend (eql etags))) +(cl-defmethod xref-backend-identifier-at-point ((_backend (eql 'etags))) (find-tag--default)) =20 -(cl-defmethod xref-backend-identifier-completion-table ((_backend (eql eta= gs))) +(cl-defmethod xref-backend-identifier-completion-table ((_backend + (eql 'etags))) (tags-lazy-completion-table)) =20 -(cl-defmethod xref-backend-identifier-completion-ignore-case ((_backend (e= ql etags))) +(cl-defmethod xref-backend-identifier-completion-ignore-case ((_backend + (eql 'etags= ))) (find-tag--completion-ignore-case)) =20 -(cl-defmethod xref-backend-definitions ((_backend (eql etags)) symbol) +(cl-defmethod xref-backend-definitions ((_backend (eql 'etags)) symbol) (etags--xref-find-definitions symbol)) =20 -(cl-defmethod xref-backend-apropos ((_backend (eql etags)) pattern) +(cl-defmethod xref-backend-apropos ((_backend (eql 'etags)) pattern) (etags--xref-find-definitions (xref-apropos-regexp pattern) t)) =20 (defun etags--xref-find-definitions (pattern &optional regexp?) diff --git a/test/lisp/emacs-lisp/checkdoc-tests.el b/test/lisp/emacs-lisp/= checkdoc-tests.el index 7a7aa9fb3c..2a1d8b2763 100644 --- a/test/lisp/emacs-lisp/checkdoc-tests.el +++ b/test/lisp/emacs-lisp/checkdoc-tests.el @@ -49,27 +49,27 @@ (with-temp-buffer (emacs-lisp-mode) ;; this method matches if A is the symbol `smthg' and if b is a list: - (insert "(cl-defmethod foo ((a (eql smthg)) (b list)) \"Return A+B.\")= ") + (insert "(cl-defmethod foo ((a (eql 'smthg)) (b list)) \"Return A+B.\"= )") (checkdoc-defun))) =20 (ert-deftest checkdoc-cl-defmethod-qualified-ok () "Checkdoc should be happy with a `cl-defmethod' using qualifiers." (with-temp-buffer (emacs-lisp-mode) - (insert "(cl-defmethod test :around ((a (eql smthg))) \"Return A.\")") + (insert "(cl-defmethod test :around ((a (eql 'smthg))) \"Return A.\")") (checkdoc-defun))) =20 (ert-deftest checkdoc-cl-defmethod-with-extra-qualifier-ok () "Checkdoc should be happy with a :extra qualified `cl-defmethod'." (with-temp-buffer (emacs-lisp-mode) - (insert "(cl-defmethod foo :extra \"foo\" ((a (eql smthg))) \"Return A= .\")") + (insert "(cl-defmethod foo :extra \"foo\" ((a (eql 'smthg))) \"Return = A.\")") (checkdoc-defun)) =20 (with-temp-buffer (emacs-lisp-mode) (insert - "(cl-defmethod foo :extra \"foo\" :after ((a (eql smthg))) \"Return A= .\")") + "(cl-defmethod foo :extra \"foo\" :after ((a (eql 'smthg))) \"Return = A.\")") (checkdoc-defun))) =20 (ert-deftest checkdoc-cl-defmethod-with-extra-qualifier-and-nil-args-ok () --=20 2.31.1 --=-=-=--