From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= Newsgroups: gmane.emacs.devel Subject: Re: Help with recursive destructive function Date: Mon, 7 May 2018 00:16:12 -0400 Message-ID: <044bdbf1-39a2-0e71-ec79-3d375d9109c8@gmail.com> 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> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: blaine.gmane.org 1525666457 6630 195.159.176.226 (7 May 2018 04:14:17 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Mon, 7 May 2018 04:14:17 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon May 07 06:14:13 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 1fFXXR-0001cv-Dy for ged-emacs-devel@m.gmane.org; Mon, 07 May 2018 06:14:13 +0200 Original-Received: from localhost ([::1]:44140 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fFXZY-00073d-6m for ged-emacs-devel@m.gmane.org; Mon, 07 May 2018 00:16:24 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:43954) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fFXZP-00073Y-Qr for emacs-devel@gnu.org; Mon, 07 May 2018 00:16:16 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fFXZO-0002Cs-Pb for emacs-devel@gnu.org; Mon, 07 May 2018 00:16:15 -0400 Original-Received: from mail-qt0-x234.google.com ([2607:f8b0:400d:c0d::234]:34099) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fFXZO-0002Ch-Kl for emacs-devel@gnu.org; Mon, 07 May 2018 00:16:14 -0400 Original-Received: by mail-qt0-x234.google.com with SMTP id m5-v6so34624887qti.1 for ; Sun, 06 May 2018 21:16:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language:content-transfer-encoding; bh=BGdVqrWoNfywrjTvqD6okbdUA+oyTqMPnT10/+IKobA=; b=bhuNLUehHLv84uzo/kk4ZEV7bmtqANGBlbI0sr1e+k41YeSPc7zerTMH0N3mUc2v5d 5BK3zdGEe11xo0xS90EWBBVgT1fIljKGLfpvdQjk/wA6iANbwwnC4dcCkX1lj3mNGfEE 22dFKEXGgGCAhBobvYpl2Z8Xepz8pfQ2fIRFIzcC4oRhx1E68o01YHvCaKveOiJ0bTG7 9wFuyCO3sPJvltfEOC6t83mVDLxwt1FTWbLdPSNRxO6SsoNW47EC3DV6bR21oyAQ+cQQ 3bx+MwzNeUX11QXX7IayT0hufNzmMkAq4T9SrwmRncEywnFvZUdApmn+wjs6/ztBh/Af 5Ovg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=BGdVqrWoNfywrjTvqD6okbdUA+oyTqMPnT10/+IKobA=; b=Ky38SpfKB4yjuecapDy2DaKUhOTT0WQTszplOSo5GSS/BlpNZ1oaFHILy/P+0YZbuU 94UbhG5popEOZK2BR1ZYHsj7gsWQPm1+N3gw/kbhFTzkA9hCW/YLxH0MaLxkjFfVnjqe KcENtQ+KxHKkg9D9P0cCG8z9uvtHPSlAwf1VLLkFWMcyao5pphvLDww80mU6I9dlsRbm epFVqPIZRdvbwuWF1pFfROGdJFBgZxIqpq2LxWVb0Hd9csiehvncKpwO6nsek9O9SFTU oqu6c/helWKid/hLP+7xs+6VzMk7/Pw/lYCxXj/ljiIyyH/+q88GLxbUcEoqYMsJ/vde 1gPQ== X-Gm-Message-State: ALQs6tA120bsCU8a6lH/x1c/JLxrRMooLse3j/PZJLJO2mKWShvS5SMA NrqlSOJtHNOdLFhy+z4lAIPP+YUa X-Google-Smtp-Source: AB8JxZpvf2MM6IlrOF15M9lzvgYrP04kcNnhoMvG8OpsJ4xsi/eMjEigSQ2nEHQ4LyyAzn3flty6OA== X-Received: by 2002:aed:3802:: with SMTP id j2-v6mr31563703qte.205.1525666573889; Sun, 06 May 2018 21:16:13 -0700 (PDT) Original-Received: from ?IPv6:2601:184:4180:66e7:7d29:3104:b05c:df65? ([2601:184:4180:66e7:7d29:3104:b05c:df65]) by smtp.gmail.com with ESMTPSA id o14-v6sm19849904qta.23.2018.05.06.21.16.13 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 06 May 2018 21:16:13 -0700 (PDT) In-Reply-To: <87k1sg185t.fsf@ericabrahamsen.net> Content-Language: en-GB X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::234 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:225099 Archived-At: On 2018-05-06 23:01, Eric Abrahamsen wrote: > I'd like to have an iterative approach to work with as well Here's a quick attempt: (defun deep-edit (f data) (let ((cur (list #'car #'setcar data)) (stack (list (list #'cdr #'setcdr data)))) (while cur (let* ((getter (car cur)) (setter (cadr cur)) (tree (caddr cur)) (subtree (funcall getter tree))) (funcall setter tree (funcall f subtree)) (cond ((consp subtree) (push (list #'cdr #'setcdr subtree) stack) (setq cur (list #'car #'setcar subtree))) (t (setq cur (pop stack)))))))) (setq test-data '("a" 1 "b" ("c" (2 ("d" . 3)) (4 . "e") "f"))) (defun f (subtree) (if (stringp subtree) (upcase subtree) subtree)) (deep-edit #'f test-data) … I'd actually tend to write it like this, if pcase is OK: (defun deep-edit (f data) (let ((cur `(car setcar ,data)) (stack `((cdr setcdr ,data)))) (while (or cur stack) (pcase-let* ((`(,getter ,setter ,cell) cur) (subtree (funcall getter cell))) (funcall setter cell (funcall f subtree)) (cond ((consp subtree) (push `(cdr setcdr ,subtree) stack) (setq cur `(car setcar ,subtree))) (t (setq cur (pop stack)))))))) Let me know if it needs clarification. I haven't tested it much, either. Clément.