From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: pjb@informatimago.com (Pascal J. Bourguignon) Newsgroups: gmane.emacs.help Subject: Re: Collecting in the opposite order in a CL loop Date: Sat, 27 Feb 2010 12:50:22 +0100 Organization: Informatimago Message-ID: <87vddiaoe9.fsf@galatea.lan.informatimago.com> References: <874ol3bds5.fsf@galatea.lan.informatimago.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: dough.gmane.org 1267274480 23428 80.91.229.12 (27 Feb 2010 12:41:20 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Sat, 27 Feb 2010 12:41:20 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Sat Feb 27 13:41:17 2010 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1NlLyt-0006jk-2o for geh-help-gnu-emacs@m.gmane.org; Sat, 27 Feb 2010 13:41:15 +0100 Original-Received: from localhost ([127.0.0.1]:34888 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NlLys-0001VT-Er for geh-help-gnu-emacs@m.gmane.org; Sat, 27 Feb 2010 07:41:14 -0500 Original-Path: news.stanford.edu!usenet.stanford.edu!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 64 Original-X-Trace: individual.net UnUsJHdriIVGJn8SPU8u6Qs8hSXvB89pdTSa9x/JVMss+H5hgW Cancel-Lock: sha1:YTA5N2Q3NTE5ZmVjODE1MTFkN2U1ODAxMzM1NzNmYzI4MjQyYWI5OA== sha1:TJXbAnIu7aA1Lxb8AQGfcq2glyY= Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en X-Disabled: X-No-Archive: no User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (darwin) Original-Xref: news.stanford.edu gnu.emacs.help:177151 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:72186 Archived-At: Sean McAfee writes: > pjb@informatimago.com (Pascal J. Bourguignon) writes: > >> Sean McAfee writes: >>> (loop for x = num then (/ x 10) until (zerop x) with result = nil do >>> (setq result (cons (mod x 10) result)) >>> finally return result) > >> Use push instead of setq cons. >> Use truncate instead of / for integer division. >> Use finally (return ...); finally return is ClTl2, not Common Lisp. > > Thanks for the tips. But what's the reason for the last two? They seem > equivalent to me, aside from the latter forms having the small advantage > of brevity over the former. You expressed a desire to program in a more "common" lisp. In CL (/ 13 10) --> 13/10, and in CL finally return is invalid. >>> Is there an elegant way to build up a list "backwards" using the CL loop >>> facility? > >> Notice that building this list backwards as you want it is wrong: >> >> 1234 --> (1 2 3 4) >> 34 --> (3 4) >> >> with the most significant digits in the lowest indexes, you cannot use >> the list of digits do to anything. > > Nothing except what I need it for. I want to transform my input text in > chunks of a certain small unit, identified by a regexp, and to do so a > variable number of units at a time, inserting a space between the > groups. The basic outline of my code is as follows: > > (defun transform-text (arg) > (interactive "p") > (save-match-data > (loop for count in (digits-of arg) do > (loop repeat count do > (search-forward-regexp "\\=\\s *\\(etc.etc.\\)") > (replace-match (compute-replacement-text (match-string 1))) > finally (insert " ")) > finally (backward-delete-char 1)))) > > So an argument of 123 to this routine would mean "transform one unit, > insert a space, transform two more units, add a space, and lastly > transform three more units." I need the digits most-significant-first > because that's the order I typed them in. > > Anyway, I like how the collect clause lets me accumulate a return value > for the loop without having to declare one explicitly, and was hoping a > similar construction might let me do the same in the correct order for > this usage. Well, the most elegant way is often to use a recursive function as I showed. Since it is expected that interactive user input won't overflow the stack, there's no problem in using it. -- __Pascal Bourguignon__