From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: =?utf-8?Q?Johan_Bockg=C3=A5rd?= Newsgroups: gmane.emacs.devel Subject: Re: Question on pcase Date: Wed, 28 Oct 2015 00:50:44 +0100 Message-ID: <87r3kfg9bf.fsf@gnu.org> References: <871tcngdv2.fsf@gmail.com> <87k2qe1u09.fsf@web.de> <83r3kmrtat.fsf@gnu.org> <87k2qdeqym.fsf@gmail.com> <87lhat22pv.fsf@web.de> <87ziz9dadv.fsf@gmail.com> <87wpud68e6.fsf@web.de> <87k2qdd8c7.fsf@gmail.com> <87si5165ze.fsf@web.de> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1445989876 29906 80.91.229.3 (27 Oct 2015 23:51:16 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 27 Oct 2015 23:51:16 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Oct 28 00:51:06 2015 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1ZrE1B-0004nQ-C8 for ged-emacs-devel@m.gmane.org; Wed, 28 Oct 2015 00:51:05 +0100 Original-Received: from localhost ([::1]:34887 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZrE1A-0002TK-EW for ged-emacs-devel@m.gmane.org; Tue, 27 Oct 2015 19:51:04 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:33567) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZrE0w-0002T9-MZ for emacs-devel@gnu.org; Tue, 27 Oct 2015 19:50:51 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZrE0t-0006Qs-8v for emacs-devel@gnu.org; Tue, 27 Oct 2015 19:50:50 -0400 Original-Received: from smtprelay-b32.telenor.se ([213.150.131.21]:58422) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZrE0s-0006QN-Pz for emacs-devel@gnu.org; Tue, 27 Oct 2015 19:50:47 -0400 Original-Received: from ipb4.telenor.se (ipb4.telenor.se [195.54.127.167]) by smtprelay-b32.telenor.se (Postfix) with ESMTP id 98172F1F53 for ; Wed, 28 Oct 2015 00:50:45 +0100 (CET) X-SMTPAUTH-B2: [bocjoh] X-SENDER-IP: [85.229.6.149] X-LISTENER: [smtp.bredband.net] X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CICADEDDBWPJUG5VVeGQEDBgEBAwECAYMKgTQPglyDfrhKgVqGGgKBQDoTAQEBAQEBAQYBAQEBQT+ENgEBAwFWKAsLISUPAQQYAQwKLYgbAwoMAcB3IoQ4AQshi3WFFBeEFwWWOKlWIwGERD00hX0BAQE X-IPAS-Result: A2CICADEDDBWPJUG5VVeGQEDBgEBAwECAYMKgTQPglyDfrhKgVqGGgKBQDoTAQEBAQEBAQYBAQEBQT+ENgEBAwFWKAsLISUPAQQYAQwKLYgbAwoMAcB3IoQ4AQshi3WFFBeEFwWWOKlWIwGERD00hX0BAQE X-IronPort-AV: E=Sophos;i="5.20,207,1444687200"; d="scan'208";a="87909589" Original-Received: from c-9506e555.04-211-6c6b701.cust.bredbandsbolaget.se (HELO muon.localdomain) ([85.229.6.149]) by ipb4.telenor.se with ESMTP; 28 Oct 2015 00:50:45 +0100 Original-Received: by muon.localdomain (Postfix, from userid 1000) id 65CFC4841C0; Wed, 28 Oct 2015 00:50:44 +0100 (CET) Mail-Copies-To: never In-Reply-To: <87si5165ze.fsf@web.de> (Michael Heerdegen's message of "Fri, 23 Oct 2015 15:59:17 +0200") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (gnu/linux) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 213.150.131.21 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 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.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:192762 Archived-At: Michael Heerdegen writes: > The only thing that makes sense to me would be to make `edebug' let you > step into a pattern. AFAICT that would be a very hard work. Edebug already understands most of pcase's patterns, but it doesn't step "into" the SYMBOL bindings. Try this: pcase.el: Support edebug stepping of SYMBOL patterns * lisp/emacs-lisp/pcase.el (pcase-SYMBOL) New edebug spec. (pcase-PAT): Use it. (pcase--edebug-match-symbol): New function. (pcase-QPAT): Improve handling of cons patterns. diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el index 8bcb447..3ea519c 100644 --- a/lisp/emacs-lisp/pcase.el +++ b/lisp/emacs-lisp/pcase.el @@ -70,31 +70,20 @@ (defconst pcase--dontcare-upats '(t _ pcase--dontcare)) (defvar pcase--dontwarn-upats '(pcase--dontcare)) -(def-edebug-spec - pcase-PAT - (&or symbolp - ("or" &rest pcase-PAT) - ("and" &rest pcase-PAT) - ("guard" form) - ("let" pcase-PAT form) - ("pred" pcase-FUN) - ("app" pcase-FUN pcase-PAT) - pcase-MACRO - sexp)) - -(def-edebug-spec - pcase-FUN - (&or lambda-expr - ;; Punt on macros/special forms. - (functionp &rest form) - sexp)) - -(def-edebug-spec pcase-MACRO pcase--edebug-match-macro) - ;; Only called from edebug. (declare-function get-edebug-spec "edebug" (symbol)) (declare-function edebug-match "edebug" (cursor specs)) +(declare-function edebug-no-match "edebug" (cursor &rest args)) +(declare-function edebug-top-element-required "edebug" (cursor &rest error)) +(def-edebug-spec pcase-SYMBOL pcase--edebug-match-symbol) +(defun pcase--edebug-match-symbol (cursor) + (let ((sexp (edebug-top-element-required cursor "Expected" '(symbolp)))) + (if (or (not (symbolp sexp)) (keywordp sexp)) + (edebug-no-match cursor "Expected" '(symbolp)) + (list `(and ,sexp (let _ ,(car (edebug-match cursor '(form))))))))) + +(def-edebug-spec pcase-MACRO pcase--edebug-match-macro) (defun pcase--edebug-match-macro (cursor) (let (specs) (mapatoms @@ -105,6 +94,26 @@ (defun pcase--edebug-match-macro (cursor) specs))))) (edebug-match cursor (cons '&or specs)))) +(def-edebug-spec + pcase-FUN + (&or lambda-expr + ;; Punt on macros/special forms. + (functionp &rest form) + sexp)) + +(def-edebug-spec + pcase-PAT + (&or "_" + pcase-SYMBOL + ("or" &rest pcase-PAT) + ("and" &rest pcase-PAT) + ("guard" form) + ("let" pcase-PAT form) + ("pred" pcase-FUN) + ("app" pcase-FUN pcase-PAT) + pcase-MACRO + sexp)) + ;;;###autoload (defmacro pcase (exp &rest cases) "Perform ML-style pattern matching on EXP. @@ -865,8 +874,10 @@ (defun pcase--u1 (matches code vars rest) (def-edebug-spec pcase-QPAT + ;; Cf. edebug spec for `backquote-form' in edebug.el. (&or ("," pcase-PAT) - (pcase-QPAT . pcase-QPAT) + (pcase-QPAT [&rest [¬ ","] pcase-QPAT] + . [&or nil pcase-QPAT]) (vector &rest pcase-QPAT) sexp))