From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Dmitry Gutov Newsgroups: gmane.emacs.bugs Subject: bug#23430: 25.0.93; iter-defun does not support special form save-current-buffer Date: Fri, 6 May 2016 01:46:54 +0300 Message-ID: References: <86k2jc2ahf.fsf@yandex.ru> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------78EECA99810C866BEA655167" X-Trace: ger.gmane.org 1462488521 16696 80.91.229.3 (5 May 2016 22:48:41 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 5 May 2016 22:48:41 +0000 (UTC) To: 23430@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri May 06 00:48:31 2016 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 1ayS4N-0001DJ-3e for geb-bug-gnu-emacs@m.gmane.org; Fri, 06 May 2016 00:48:31 +0200 Original-Received: from localhost ([::1]:55708 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ayS4K-0003jA-Ag for geb-bug-gnu-emacs@m.gmane.org; Thu, 05 May 2016 18:48:28 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:42654) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ayS4A-0003V8-E3 for bug-gnu-emacs@gnu.org; Thu, 05 May 2016 18:48:24 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ayS3y-0006cN-JZ for bug-gnu-emacs@gnu.org; Thu, 05 May 2016 18:48:12 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:56795) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ayS3x-0006al-DT for bug-gnu-emacs@gnu.org; Thu, 05 May 2016 18:48:06 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1ayS3t-0006gO-Sd for bug-gnu-emacs@gnu.org; Thu, 05 May 2016 18:48:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Dmitry Gutov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 05 May 2016 22:48:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 23430 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 23430-submit@debbugs.gnu.org id=B23430.146248842425616 (code B ref 23430); Thu, 05 May 2016 22:48:01 +0000 Original-Received: (at 23430) by debbugs.gnu.org; 5 May 2016 22:47:04 +0000 Original-Received: from localhost ([127.0.0.1]:40899 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ayS2y-0006f5-4j for submit@debbugs.gnu.org; Thu, 05 May 2016 18:47:04 -0400 Original-Received: from mail-wm0-f48.google.com ([74.125.82.48]:36555) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ayS2w-0006eb-Hn for 23430@debbugs.gnu.org; Thu, 05 May 2016 18:47:02 -0400 Original-Received: by mail-wm0-f48.google.com with SMTP id n129so37670151wmn.1 for <23430@debbugs.gnu.org>; Thu, 05 May 2016 15:47:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:from:message-id:date:user-agent :mime-version:in-reply-to; bh=EaqK3pqKqR+agt1HRSoBKnz95NLii6uzmqdHMHTG91k=; b=QMVIygi2d+oDfaWpCs+vBbTqHeCOHCqcq0NNYjUx+KrGqeM1F/bqijOTW76Ol4muOr /iYy6LpYcaKarjcMBbriMMxuWVTeiOaDRD+7Je67nybtnbm/Fip3ITZhnd8POARuK5qw eQHUM5W37FkMR5IF8YjH8aVcx/aZOJlIw90fGY5T1iMOoH28lWY61CKM/UXKJMkTwb2j ie30XARueNDWv0bQce2xLda0/EtrFqWJWy1zKG4+q7CCbUir9Cvar3WRAF1BzstgGZW7 IRth4/98X8uQPLLM5fPzhu/Hh4TXQnZYDLlAVgGl8k6Mlr1MkFu1yTnOSLIemLcEkxcy QK1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:from:message-id :date:user-agent:mime-version:in-reply-to; bh=EaqK3pqKqR+agt1HRSoBKnz95NLii6uzmqdHMHTG91k=; b=EAY7E8E4MiKTHv5cIC0Y2MFnINnAXUR3331C4WF+Z/0nLLTX0KNgYF1byFYJfHPFMP TBeonnYA5o9kptpbW84Q+5mYaJBc/GwxXr3lVycioRBBXcIpHGeGLzqf+WX1Ty8vcjOE Ltzo5dTRN04P1BdpYPfkQ0mC9/5x/WU5I2dcGtIoi1OnnEMT/i8eEMpUelYPQRSkLv0Q UxBLCBQHrjMXAaX+qbr+piq4hWR3v3Ge/VBGqvK5c3uzb3DaGyTH/efOCGH0Hf0Xqpuh uTuv3XdNKdSQrJXM51KKQcLRpMpBsYZgXBQHD2rZoF3lj2SqKpxuzlCEmax9LPyakcGx oQ7Q== X-Gm-Message-State: AOPr4FV/vcrmtKVz1hSWUap62tpV7KwST+bKtrr83wOfJEdd7M6T/Gb74DJAkhugn1sFhA== X-Received: by 10.28.234.130 with SMTP id g2mr6174736wmi.42.1462488416934; Thu, 05 May 2016 15:46:56 -0700 (PDT) Original-Received: from [192.168.1.2] ([185.105.175.24]) by smtp.googlemail.com with ESMTPSA id jq1sm11873826wjc.28.2016.05.05.15.46.55 for <23430@debbugs.gnu.org> (version=TLSv1/SSLv3 cipher=OTHER); Thu, 05 May 2016 15:46:56 -0700 (PDT) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1 In-Reply-To: <86k2jc2ahf.fsf@yandex.ru> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.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" Xref: news.gmane.org gmane.emacs.bugs:117881 Archived-At: This is a multi-part message in MIME format. --------------78EECA99810C866BEA655167 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit On 05/03/2016 04:31 AM, Dmitry Gutov wrote: > The above example seemed to me to be the prime use case for generator.el > (e.g. lazily parsing output from an asynchronous process), so this > is disappointing. Actually, I take this back. - generator.el doesn't seem useful for parsing output from an asynchronous process because it has no way to indicate whether the process has new output, or to return control back to Emacs while the process is still running but has no new output. It seems to call for a different abstraction. - with-current-buffer turned out not to be so essential. Nor save-excursion. I've reimplemented xref--buf-pairs-iterator using iter-lambda but couldn't get the full benefit of the package because that function also needs a way to reliably clean up resources. The result is a bit more comprehensible, but also longer, so I'm hesitant to use it (attached). So sum up, maybe this bug can be closed, but I'd like to see Daniel's opinion. Supporting with-current-buffer might turn out to be more essential in other cases. --------------78EECA99810C866BEA655167 Content-Type: text/x-patch; name="xref-gen.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xref-gen.diff" diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index f651dc9..f8b3c85 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -71,6 +71,7 @@ (require 'ring) (require 'pcase) (require 'project) +(require 'generator) (eval-when-compile (require 'semantic/symref)) ;; for hit-lines slot @@ -534,19 +535,12 @@ xref-query-replace-in-results (funcall iter :cleanup)))) (defun xref--buf-pairs-iterator (xrefs) - (let (chunk-done item next-pair file-buf pairs all-pairs) - (lambda (action) - (pcase action - (:next - (when (or xrefs next-pair) - (setq chunk-done nil) - (when next-pair - (setq file-buf (marker-buffer (car next-pair)) - pairs (list next-pair) - next-pair nil)) - (while (and (not chunk-done) - (setq item (pop xrefs))) - (save-excursion + (let* (item + file-buf pairs all-pairs + (iter + (funcall + (iter-lambda () + (while (setq item (pop xrefs)) (let* ((loc (xref-item-location item)) (beg (xref-location-marker loc)) (end (move-marker (make-marker) @@ -568,9 +562,19 @@ xref--buf-pairs-iterator ((equal file-buf (marker-buffer beg)) (push pair pairs)) (t - (setq chunk-done t - next-pair pair)))))))) - (cons file-buf (nreverse pairs)))) + (iter-yield (cons file-buf (nreverse pairs))) + (setq file-buf (marker-buffer beg) + pairs (list pair))))))) + (when (null xrefs) + (iter-yield (cons file-buf (nreverse pairs))))))))) + (lambda (action) + (pcase action + (:next + (condition-case nil + (save-excursion + (iter-next iter)) + (iter-end-of-sequence + nil))) (:cleanup (dolist (pair all-pairs) (move-marker (car pair) nil) --------------78EECA99810C866BEA655167--