From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Pascal J. Bourguignon" Newsgroups: gmane.emacs.help Subject: Re: I'd like to marry while and mapcar... Date: Fri, 06 Feb 2015 17:52:45 +0100 Organization: Informatimago Message-ID: <87386jouci.fsf@kuiper.lan.informatimago.com> References: <87vbjfdwq7.fsf@wmi.amu.edu.pl> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: ger.gmane.org 1423243076 1569 80.91.229.3 (6 Feb 2015 17:17:56 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 6 Feb 2015 17:17:56 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Fri Feb 06 18:17:56 2015 Return-path: Envelope-to: geh-help-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 1YJmXT-0002YO-9z for geh-help-gnu-emacs@m.gmane.org; Fri, 06 Feb 2015 18:17:55 +0100 Original-Received: from localhost ([::1]:49666 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJmXS-0001MT-OE for geh-help-gnu-emacs@m.gmane.org; Fri, 06 Feb 2015 12:17:54 -0500 Original-Path: usenet.stanford.edu!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 43 Original-X-Trace: individual.net U8BcKY5sTxrs/zsb+JLDpwGGqMW05dwFmmtQZHu6nLn50tDE+M Cancel-Lock: sha1:NmM5YjhjMTZiYmYzNTE4ZTY2MGExYzFhOWUwOGI0MjJiNGVhZDNlYQ== sha1:3lpJcnbg+Z0zPTVr7Cqf34VE9KM= Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) Original-Xref: usenet.stanford.edu gnu.emacs.help:210263 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:102540 Archived-At: Barry Margolin writes: > In article , > Eli Zaretskii wrote: > >> > From: Marcin Borkowski >> > Date: Fri, 06 Feb 2015 13:56:48 +0100 >> > >> > What I'd need is kind of a marriage of while and mapcar: I'd like to run >> > some function until it returns nil and make a list of all results it >> > gives back until then. >> >> Can't you use 'throw' from within the function called by mapcar? > > That would allow you to terminate the loop, but how will it return the > list of the results? The function doesn't get a reference to the list of > results, so what value would you throw? And worse: with mapcar, you'd have to duplicate the result list building. You can avoid it with mapc, but you need to return it both when the list is exhausted and in the early exit, which is clearly not pretty: (defun map-while (pred-fun list) (catch 'result (let ((results '())) (mapc (lambda (x) (let ((result (funcall pred-fun x))) (if result (push result results) (throw 'result (nreverse results))))) list) (nreverse results)))) (map-while 'oddp '(1 3 5 4 6 8)) --> (t t t) -- __Pascal Bourguignon__ http://www.informatimago.com/ “The factory of the future will have only two employees, a man and a dog. The man will be there to feed the dog. The dog will be there to keep the man from touching the equipment.” -- Carl Bass CEO Autodesk