From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Eric Abrahamsen Newsgroups: gmane.emacs.devel Subject: Re: Help with recursive destructive function Date: Sat, 28 Jul 2018 13:52:40 -0700 Message-ID: <87fu03gk13.fsf@ericabrahamsen.net> References: <87efiqzzd2.fsf@ericabrahamsen.net> <87bmdu3mtf.fsf@web.de> <87zi1e9kju.fsf@web.de> <87o9hs3aht.fsf@ericabrahamsen.net> <87bmds9qcg.fsf@web.de> <87k1sg185t.fsf@ericabrahamsen.net> <044bdbf1-39a2-0e71-ec79-3d375d9109c8@gmail.com> <877eof1k7y.fsf@ericabrahamsen.net> <87wowe2sql.fsf@web.de> <877eoe2dma.fsf@ericabrahamsen.net> <87tvrgqnug.fsf@web.de> <87vabvbfrj.fsf@web.de> <87d0y30wkn.fsf@ericabrahamsen.net> <878t8mtiqz.fsf@web.de> <87bmdixji9.fsf@ericabrahamsen.net> <87y3glomjm.fsf@web.de> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1532811066 21507 195.159.176.226 (28 Jul 2018 20:51:06 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sat, 28 Jul 2018 20:51:06 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) Cc: emacs-devel@gnu.org To: Michael Heerdegen Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Jul 28 22:51:02 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 1fjWB3-0005N0-GZ for ged-emacs-devel@m.gmane.org; Sat, 28 Jul 2018 22:51:01 +0200 Original-Received: from localhost ([::1]:46389 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fjWD6-0006id-VT for ged-emacs-devel@m.gmane.org; Sat, 28 Jul 2018 16:53:08 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:39375) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fjWD0-0006iY-1U for emacs-devel@gnu.org; Sat, 28 Jul 2018 16:53:03 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fjWCw-0007b0-VE for emacs-devel@gnu.org; Sat, 28 Jul 2018 16:53:02 -0400 Original-Received: from mail.ericabrahamsen.net ([50.56.99.223]:43265) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fjWCw-0007WV-P1 for emacs-devel@gnu.org; Sat, 28 Jul 2018 16:52:58 -0400 Original-Received: from localhost (97-113-227-87.tukw.qwest.net [97.113.227.87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) (Authenticated sender: eric@ericabrahamsen.net) by mail.ericabrahamsen.net (Postfix) with ESMTPSA id 52451C2678; Sat, 28 Jul 2018 20:52:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mail.ericabrahamsen.net; s=mail; t=1532811171; bh=gm6iPqvK1sYLbAyYiYJqaLvMroI3lMPeYqqp/+K5oWM=; h=From:To:Cc:Subject:References:Date:In-Reply-To:From; b=M5sKFS/Q8+3y8XtxW+kwyQL8tNzTEslNFf49x1lz3ZXRYJnTOEvm3ntHGPmmeaLAr RJ0LlOjoWUg0/v9OCsB94b+d8s7kxUTaZ6T4qBSkf6zoU2w6DBX2EP923/fsWd46RO rWOigSmbyndiz0yOc7nJutMoMYPoDJ/bAg4wVyMI= In-Reply-To: <87y3glomjm.fsf@web.de> (Michael Heerdegen's message of "Tue, 15 May 2018 01:16:45 +0200") X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 50.56.99.223 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:227929 Archived-At: On 05/15/18 01:16 AM, Michael Heerdegen wrote: > Eric Abrahamsen writes: > >> For backwards compatibility, we need to be able to handle lists that are >> quoted, or that start with the symbol `list'. This will sound familiar >> to you... In the non-destructive version, it was easy enough just to >> return (cdr thing) instead of thing. > > What will this code do when the saved list was really quoted, or was a > list with the symbol list as first element? Wouldn't the backward > compatible version cause errors? After weeks of avoiding this, I'm nearly there. This version does everything I need it to, EXCEPT I have somehow lost the ability to handle single-atom data, which was the whole point of passing in a gv-ref. I don't understand why, it seemed to be working fine, but I switched to cl-labels and maybe changed some other things (I didn't keep the intermediate version), and now it just doesn't do it. Would you help me take one more look at this? It also doesn't handle '(list), but those cases are rare and occur at top-level, so I can take care of them in pre-processing. #+BEGIN_SRC elisp (defun deep-edit (data edit-p traverse-p) (let ((stack (list (gv-deref data)))) (cl-labels ((handle-refs (refs) (dolist (ref refs) (let* ((val (gv-deref ref)) (edit (when val (funcall edit-p val)))) (when (car edit) (cl-callf (lambda (x) (funcall (car edit) x)) (gv-deref ref)) (when (cdr edit) (handle-refs (list ref)))) (when (funcall traverse-p (gv-deref ref)) (push (gv-deref ref) stack)))))) (while stack (let ((current (pop stack))) (cond ((consp current) (handle-refs `(,(gv-ref (car current)) ,(gv-ref (cdr current))))) ((and (arrayp current) (not (stringp current))) (handle-refs (mapcar (lambda (idx) (gv-ref (aref current idx))) (number-sequence 0 (1- (length current)))))) ((hash-table-p current) (let ((refs '())) (maphash (lambda (key _val) ;; Order matters here! (push (gv-ref (gethash key current)) refs) (push (gv-ref (deep-edit-hash-key key current)) refs)) current) (handle-refs (nreverse refs)))))))))) (let ((tree '("one" two ''(three "four" (list "five"))))) (deep-edit (gv-ref tree) (lambda (thing) (cond ((consp thing) (pcase (car thing) ('list (cons #'cdr t)) ('quote (cons #'cadr t)))) ((stringp thing) (cons #'upcase nil)))) (lambda (thing) (consp thing))) tree) #+END_SRC The above works, yet if I change `tree' to be a plain string "one", it isn't transformed. I just can't see why. Eric