From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Michael Heerdegen Newsgroups: gmane.emacs.devel Subject: Re: Help with recursive destructive function Date: Sat, 05 May 2018 17:41:41 +0200 Message-ID: <87zi1e9kju.fsf@web.de> References: <87efiqzzd2.fsf@ericabrahamsen.net> <87bmdu3mtf.fsf@web.de> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1525534800 10756 195.159.176.226 (5 May 2018 15:40:00 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sat, 5 May 2018 15:40:00 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) Cc: Eric Abrahamsen To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat May 05 17:39:55 2018 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fEzHv-0002hn-Id for ged-emacs-devel@m.gmane.org; Sat, 05 May 2018 17:39:55 +0200 Original-Received: from localhost ([::1]:39181 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEzK2-000612-5Z for ged-emacs-devel@m.gmane.org; Sat, 05 May 2018 11:42:06 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:39829) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEzJw-00060i-1S for emacs-devel@gnu.org; Sat, 05 May 2018 11:42:00 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fEzJr-0006hG-5C for emacs-devel@gnu.org; Sat, 05 May 2018 11:42:00 -0400 Original-Received: from mout.web.de ([212.227.17.11]:60217) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fEzJq-0006gl-SR for emacs-devel@gnu.org; Sat, 05 May 2018 11:41:55 -0400 Original-Received: from drachen.dragon ([188.110.196.170]) by smtp.web.de (mrweb103 [213.165.67.124]) with ESMTPSA (Nemesis) id 0MeSGJ-1eyh7A2ZKB-00Q9zr; Sat, 05 May 2018 17:41:43 +0200 In-Reply-To: <87bmdu3mtf.fsf@web.de> (Michael Heerdegen's message of "Sat, 05 May 2018 03:37:00 +0200") X-Provags-ID: V03:K1:dMRWyl+QpWA0vlKqZ7hrfEqeoc8Zwc0TjHhoDpxoLelfO+D73aB dEe6KUbLs901yjT2Z+WB7b1q3URBIzAAnQALewrj57jJc7OOuxvia/ofvWRol7Iz3oJoGmy yjnkw6Td1VCeH2lzyXN/NA/d3Nd8wW4nnmLYhU3iFeqoJBTeJCqDJaxd/V1Y1DoQ11As0cr ak6U8Ri/WJE/UBdz/N1nw== X-UI-Out-Filterresults: notjunk:1;V01:K0:DAc3mnBTNgw=:G1ihM6psVcklDYq7SHMZvF 6XQqGLxRWoqcHphCo+jVNlOdTv/oSXqSzu3rwlR+RyQMElJqBpAU5y23aQfz6ifoMo7J+nKH3 GohlkcKMYhChvJWXj804G8NfZA0HLjT0Ko+cjsaJWg30waN00ddtocvQiSJ15+QpDj/UFYUxE yRcIoIx0r1GtF3Fs3WzS/jTLbYARKvA+j+pzUFPXkSgJrJhpwis5fDVv5R6Md9wcq0uWd33NR I2UL6rZK9p6vCRSVBfwRJqBXIWgVOgtIv6LMacove6N93ybuY/vy46S1Y1XUPoBrb05scY4m/ rjQg7r0cklXhrmgRgmjUzYB8YEeQ/1PRvFLpBy4kEtUFgxo+RqxQNGYl5EKaD2YPwBUw1KkzS a3wkdSRWzbHnHKh3s+1hcr7qFctDKYJfuppkj66OgkQp9dhy8G0eME1c510gay6mUue7v+8ER t7320O/ayGXhiDzrSeAclSLWnJD/3LoAVGDU1E8R10PqS22wwz8PYD1su9ZLlLOiKZsD8pn2P YQDYWk+QsH90s0+xJYoOmDlwtDBKTfRXKKRP27RSYoLOyHoRpu5069BcuyBwrQCLSF+y+aSDx YjwgQO8QQLruy9Rp7GlYlr0SAxYFFwYNv/MSBWJrhtFzEeTrUvYnM2ty9T3tQVRr47Zi/r88t kyYchezggMyFEEmgBgKj6VcmnT0QAvRsX6rPMNre0S98Erne635md7GiK321jl+oTJpl1asKF NvP/GdwB7Zos4k/GnIM1jYfcc+YH4jNzR8QxCgyIXrStgBaf6bnky39Jp34cN0G2RCpJ+S/4 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.11 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 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" Xref: news.gmane.org gmane.emacs.devel:225080 Archived-At: I wrote: > I guess I would use an iterator: the definition would still looks > recursive, but the execution isn't problematic any more if done right. Here is an example: #+begin_src emacs-lisp (iter-defun iter-tree-example (tree) (cl-loop for thing in-ref tree by #'cdr do (if (consp thing) (iter-yield-from (iter-tree-example thing)) (iter-yield (ignore (when (stringp thing) (cl-callf upcase thing))))))) (let ((tree '("a" 1 ("b" "c" ("d")) "e"))) (iter-do (_ (iter-tree-example tree))) tree) ==> ("A" 1 ("B" "C" ("D")) "E") (let ((huge-list (number-sequence 1 100000))) (setcdr (last huge-list) (cons "a" nil)) (iter-do (_ (iter-tree-example huge-list))) (ignore huge-list)) |-- takes some time but doesn't crash #+end_src Yield values don't have any purpose but I guess without yielding you would get no CPS rewrite but a standard recursive function that would be problematic with the HUGE-LIST. Michael.