From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Adam Porter Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] pcase.el: Add cl-type and type patterns Date: Sat, 17 Jul 2021 11:07:03 -0500 Message-ID: <87eebworfc.fsf@alphapapa.net> References: <874kuxxuez.fsf@alphapapa.net> <87r1y1wcj4.fsf@alphapapa.net> <87h7yxw5x1.fsf@alphapapa.net> <87a74puq1q.fsf@web.de> <87d09lw3id.fsf@alphapapa.net> <87zhcoqmmz.fsf@web.de> <87wo7s8b73.fsf@alphapapa.net> <87eec53a8r.fsf_-_@alphapapa.net> <87a6mt38fa.fsf@alphapapa.net> 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="21087"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat Jul 17 18:07:56 2021 Return-path: Envelope-to: ged-emacs-devel@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 1m4mr6-0005IN-6G for ged-emacs-devel@m.gmane-mx.org; Sat, 17 Jul 2021 18:07:56 +0200 Original-Received: from localhost ([::1]:53904 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m4mr5-00037t-8r for ged-emacs-devel@m.gmane-mx.org; Sat, 17 Jul 2021 12:07:55 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:47604) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m4mqU-000262-8d for emacs-devel@gnu.org; Sat, 17 Jul 2021 12:07:18 -0400 Original-Received: from ciao.gmane.io ([116.202.254.214]:43292) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m4mqR-0006xm-SH for emacs-devel@gnu.org; Sat, 17 Jul 2021 12:07:17 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1m4mqO-0004Wn-0w for emacs-devel@gnu.org; Sat, 17 Jul 2021 18:07:12 +0200 X-Injected-Via-Gmane: http://gmane.org/ Received-SPF: pass client-ip=116.202.254.214; envelope-from=ged-emacs-devel@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:271338 Archived-At: --=-=-= Content-Type: text/plain Stefan Monnier writes: >> +@item (cl-type @var{type}) >> +Matches if @var{expval} is of type @var{type}, which is a symbol or >> +list as accepted by @ref{cl-typep,,,cl,Common Lisp Extensions}. > > Rather than mention "symbol or list", I'd only refer to `cl-typep`, > maybe something like: > > Matches if @var{expval} is of type @var{type}, which is type descriptor > as accepted by @ref{cl-typep,,,cl,Common Lisp Extensions}. > > The rest of the first patch looks good to me. Thanks, I've made this change in the attached patch. (FYI, Eli recommends against using the @ref style, see .) > I'm not convinced this second patch is worth the trouble: > > (type FOO) > > is not significantly shorter or simpler than > > (pred FOO-p) It's not significantly shorter, but it does make the purpose a bit more obvious at a glance ("type" vs. "pred"). :) But anyway... > but it is inherently brittle because `intern-soft` may > return non-nil even though there's no predicate by that name, and it may > also let you use a "type" which really isn't one such as > `cl--struct-name` or `looking-at`. > > `cl-type` provides that functionality in a cleaner and more > reliable way (it still also relies to some extent on similar heuristic > as your code, admittedly, but I've been working to get rid of it). I understand. Thanks for your work on that. I've omitted the "type" patch from this update. Thanks for all your help. --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-lisp-emacs-lisp-cl-macs.el-Add-cl-type-pattern.patch Content-Description: Add cl-type matcher >From 0db5d42a2afdb98470434117803f7fb1ef9fb210 Mon Sep 17 00:00:00 2001 From: Adam Porter Date: Mon, 9 Mar 2020 13:01:32 -0500 Subject: [PATCH] * lisp/emacs-lisp/cl-macs.el: Add cl-type pattern * lisp/emacs-lisp/cl-macs.el: ((pcase-defmacro type)): Add 'cl-type' pattern. * test/lisp/emacs-lisp/pcase-tests.el (pcase-tests-cl-type): Add test. * doc/lispref/control.texi (pcase Macro): Update manual. With thanks to Stefan Monnier and Eli Zaretskii for their guidance. --- doc/lispref/control.texi | 10 ++++++++++ etc/NEWS | 5 +++++ lisp/emacs-lisp/cl-macs.el | 8 ++++++++ test/lisp/emacs-lisp/pcase-tests.el | 10 ++++++++++ 4 files changed, 33 insertions(+) diff --git a/doc/lispref/control.texi b/doc/lispref/control.texi index 22b665b..5026d0a 100644 --- a/doc/lispref/control.texi +++ b/doc/lispref/control.texi @@ -555,6 +555,16 @@ pcase Macro Likewise, it makes no sense to bind keyword symbols (@pxref{Constant Variables}). +@item (cl-type @var{type}) +Matches if @var{expval} is of type @var{type}, which is a type +descriptor as accepted by @code{cl-typep} (@pxref{cl-typep,,,cl,Common +Lisp Extensions}). Examples: + +@lisp +(cl-type integer) +(cl-type (integer 0 10)) +@end lisp + @item (pred @var{function}) Matches if the predicate @var{function} returns non-@code{nil} when called on @var{expval}. The test can be negated with the syntax diff --git a/etc/NEWS b/etc/NEWS index 923cfcc..3af842c 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -515,6 +515,11 @@ in better code. --- *** New function 'pcase-compile-patterns' to write other macros. +*** Added 'cl-type' pattern. +The new 'cl-type' pattern compares types using 'cl-typep', which allows +comparing simple types like '(cl-type integer)', as well as forms like +'(cl-type (integer 0 10))'. + +++ ** profiler.el The results displayed by 'profiler-report' now have the usage figures diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index cff4368..caf8bba 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -3623,6 +3623,14 @@ cl-struct-slot-value "use `with-eval-after-load' instead." "28.1") (run-hooks 'cl-macs-load-hook) +;;; Pcase type pattern. + +;;;###autoload +(pcase-defmacro cl-type (type) + "Pcase pattern that matches objects of TYPE. +TYPE is a type descriptor as accepted by `cl-typep', which see." + `(pred (pcase--flip cl-typep ',type))) + ;; Local variables: ;; generated-autoload-file: "cl-loaddefs.el" ;; End: diff --git a/test/lisp/emacs-lisp/pcase-tests.el b/test/lisp/emacs-lisp/pcase-tests.el index 2120139..02d3878 100644 --- a/test/lisp/emacs-lisp/pcase-tests.el +++ b/test/lisp/emacs-lisp/pcase-tests.el @@ -100,4 +100,14 @@ pcase-tests-or-vars (should (equal (funcall f 'b1) '(4 5 nil nil))) (should (equal (funcall f 'b2) '(nil nil 8 9))))) +(ert-deftest pcase-tests-cl-type () + (should (equal (pcase 1 + ((cl-type integer) 'integer)) + 'integer)) + (should (equal (pcase 1 + ((cl-type (integer 0 2)) 'integer-0<=n<=2)) + 'integer-0<=n<=2)) + (should-error (pcase 1 + ((cl-type notatype) 'integer)))) + ;;; pcase-tests.el ends here. -- 2.7.4 --=-=-=--