From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Leo Liu Newsgroups: gmane.emacs.bugs Subject: bug#18327: 24.4.50; [PATCH] vector QPattern for pcase Date: Mon, 25 Aug 2014 16:02:26 +0800 Message-ID: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1408953874 15011 80.91.229.3 (25 Aug 2014 08:04:34 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 25 Aug 2014 08:04:34 +0000 (UTC) To: 18327@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Aug 25 10:04:27 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1XLpGM-0006NK-JP for geb-bug-gnu-emacs@m.gmane.org; Mon, 25 Aug 2014 10:04:26 +0200 Original-Received: from localhost ([::1]:46689 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XLpGM-0003LG-75 for geb-bug-gnu-emacs@m.gmane.org; Mon, 25 Aug 2014 04:04:26 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:57955) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XLpG9-0003JB-Je for bug-gnu-emacs@gnu.org; Mon, 25 Aug 2014 04:04:22 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XLpFy-0007FG-Hi for bug-gnu-emacs@gnu.org; Mon, 25 Aug 2014 04:04:13 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:44394) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XLpFy-0007FC-Ef for bug-gnu-emacs@gnu.org; Mon, 25 Aug 2014 04:04:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1XLpFx-0004e3-UF; Mon, 25 Aug 2014 04:04:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Leo Liu Original-Sender: "Debbugs-submit" Resent-CC: monnier@iro.umontreal.ca, bug-gnu-emacs@gnu.org Resent-Date: Mon, 25 Aug 2014 08:04:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 18327 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org X-Debbugs-Original-Xcc: Stefan Monnier Original-Received: via spool by submit@debbugs.gnu.org id=B.140895379117782 (code B ref -1); Mon, 25 Aug 2014 08:04:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 25 Aug 2014 08:03:11 +0000 Original-Received: from localhost ([127.0.0.1]:51336 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1XLpF8-0004cj-No for submit@debbugs.gnu.org; Mon, 25 Aug 2014 04:03:11 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:55917) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1XLpF5-0004cU-8A for submit@debbugs.gnu.org; Mon, 25 Aug 2014 04:03:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XLpEq-0006yV-S6 for submit@debbugs.gnu.org; Mon, 25 Aug 2014 04:03:01 -0400 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:52201) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XLpEq-0006yR-PK for submit@debbugs.gnu.org; Mon, 25 Aug 2014 04:02:52 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:57587) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XLpEh-0003EC-Ka for bug-gnu-emacs@gnu.org; Mon, 25 Aug 2014 04:02:52 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XLpEY-0006vE-J4 for bug-gnu-emacs@gnu.org; Mon, 25 Aug 2014 04:02:43 -0400 Original-Received: from mail-pa0-x22f.google.com ([2607:f8b0:400e:c03::22f]:51199) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XLpEY-0006ul-BJ for bug-gnu-emacs@gnu.org; Mon, 25 Aug 2014 04:02:34 -0400 Original-Received: by mail-pa0-f47.google.com with SMTP id kx10so20393281pab.6 for ; Mon, 25 Aug 2014 01:02:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:mime-version:content-type; bh=ewteWI1ek1f2bBhpcp6lHHivA0o7SAglltUg1Lv3Y+A=; b=sZk4DXEeNYVmQvTRZf6BpzOMGqgnkH7YgsuIyx051T2rkben3GZcZyvPCRYMsJWzT0 jTztDREo1mkw+H/wBqOwtbHtmhTusxkKqpTTkxTpewIob0950qJbbRc/5zpC8bHX/1To yeEJawrbWOCx3fusf1syq/cQg6emuNJ8bonA0QZuCYdPGh7Vz8C4z4sCGpiXoWQda/Q/ gWheTGcCI4nd/6Dzg8WZeviOvdLFiaRuL18o4CIST39nwawpdocpTU7jOpctpzPar6h9 KW1I91csk5/k38h0LfSeBJsInMJCF4PQff17GncySz42aeEJzjg+mw+BxiR6WPsVMwNM qI0A== X-Received: by 10.69.18.11 with SMTP id gi11mr2282121pbd.163.1408953752724; Mon, 25 Aug 2014 01:02:32 -0700 (PDT) Original-Received: from fortuna ([221.222.148.29]) by mx.google.com with ESMTPSA id dp6sm56179211pdb.51.2014.08.25.01.02.30 for (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Mon, 25 Aug 2014 01:02:31 -0700 (PDT) X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 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.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:92655 Archived-At: --=-=-= Content-Type: text/plain Hi Stefan, The attached patch (inspired by your byte-code-function qpattern patch) seems to add vector QPattern to pcase. Could you review it and give me any comments? Thanks. I haven't wanted vector qpattern badly enough until just now having put up with many many: (and (pred vectorp) io (let `(io_request ,from ,replyas ,request) (cl-coerce io 'list))) which is both ugly and inefficient. Thanks, Leo --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=pcase-vector-qpat.diff Content-Description: pcase-vector-qpat.diff === modified file 'lisp/emacs-lisp/pcase.el' --- lisp/emacs-lisp/pcase.el 2014-01-03 04:40:30 +0000 +++ lisp/emacs-lisp/pcase.el 2014-08-25 07:52:34 +0000 @@ -54,6 +54,7 @@ ;;; Code: (require 'macroexp) +(eval-when-compile (require 'cl-lib)) ;; Macro-expansion of pcase is reasonably fast, so it's not a problem ;; when byte-compiling a file, but when interpreting the code, if the pcase @@ -447,6 +448,22 @@ (pcase--mutually-exclusive-p #'consp (cadr pat))) '(:pcase--fail . nil)))) +(defun pcase--split-vector (len syms pat) + (cond + ;; A QPattern for a vector of same length + ((and (eq (car-safe pat) '\`) + (vectorp (cadr pat)) + (= len (length (cadr pat)))) + (let ((qpat (cadr pat))) + (cons `(and ,@(cl-loop for s in syms for i from 0 + collect `(match ,s . ,(pcase--upat (aref qpat i))))) + :pcase--fail))) + ;; Other QPatterns go to the `else' side. + ((eq (car-safe pat) '\`) '(:pcase--fail . nil)) + ((and (eq (car-safe pat) 'pred) + (pcase--mutually-exclusive-p #'vectorp (cadr pat))) + '(:pcase--fail . nil)))) + (defun pcase--split-equal (elem pat) (cond ;; The same match will give the same result. @@ -738,8 +755,27 @@ ((eq (car-safe qpat) '\,) (error "Can't use `,UPATTERN")) ((floatp qpat) (error "Floating point patterns not supported")) ((vectorp qpat) - ;; FIXME. - (error "Vector QPatterns not implemented yet")) + (let* ((len (length qpat)) + (syms (mapcar (lambda (i) (make-symbol (format "xaref%s" i))) + (number-sequence 0 (1- len)))) + (splitrest (pcase--split-rest + sym + (lambda (pat) (pcase--split-vector len syms pat)) + rest)) + (then-rest (car splitrest)) + (else-rest (cdr splitrest)) + (then-body (pcase--u1 + `(,@(cl-loop for s in syms for i from 0 + collect `(match ,s . ,(pcase--upat (aref qpat i)))) + ,@matches) + code vars then-rest))) + (pcase--if + `(and (vectorp ,sym) (= (length ,sym) ,len)) + (macroexp-let* + (cl-loop for s in syms for i from 0 + when (get s 'pcase-used) collect `(,s (aref ,sym ,i))) + then-body) + (pcase--u else-rest)))) ((consp qpat) (let* ((syma (make-symbol "xcar")) (symd (make-symbol "xcdr")) --=-=-=--