From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Stefan Monnier via Users list for the GNU Emacs text editor Newsgroups: gmane.emacs.help Subject: Re: Chopping the last element of a list Date: Thu, 28 Apr 2022 19:52:11 -0400 Message-ID: References: Reply-To: Stefan Monnier Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="18243"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) To: help-gnu-emacs@gnu.org Cancel-Lock: sha1:I1c7r4vTf1y+/352qOCut3sBh5Y= Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Fri Apr 29 01:52:51 2022 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nkDwI-0004cN-8g for geh-help-gnu-emacs@m.gmane-mx.org; Fri, 29 Apr 2022 01:52:50 +0200 Original-Received: from localhost ([::1]:49026 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nkDwH-0001pL-2M for geh-help-gnu-emacs@m.gmane-mx.org; Thu, 28 Apr 2022 19:52:49 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:43188) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nkDvn-0001p8-Dl for help-gnu-emacs@gnu.org; Thu, 28 Apr 2022 19:52:19 -0400 Original-Received: from ciao.gmane.io ([116.202.254.214]:37096) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nkDvl-0004H0-S6 for help-gnu-emacs@gnu.org; Thu, 28 Apr 2022 19:52:19 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1nkDvk-0003t0-52 for help-gnu-emacs@gnu.org; Fri, 29 Apr 2022 01:52:16 +0200 X-Injected-Via-Gmane: http://gmane.org/ Received-SPF: pass client-ip=116.202.254.214; envelope-from=geh-help-gnu-emacs@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.29 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-mx.org@gnu.org Original-Sender: "help-gnu-emacs" Xref: news.gmane.io gmane.emacs.help:137077 Archived-At: emacsq via Users list for the GNU Emacs text editor [2022-04-28 09:21:23] wrote: > If I want to do this then I can do, for example: > > (prog1 > (car (last mylist)) (setq mylist (nbutlast mylist))) > > But here last and nbutlast walks the list twice unnecessarily. Right, so you see the problem with functions like `last` and `butlast` which work on the end of a list: they are only useful if that's the only thing you do with that list. As soon as you try to do more, then you end up traversing the list multiple times. > Shouldn't emacs provide a function which does it in one step, so the > list isn't walked twice? > > E.g. (choplast mylist) That would just suffer from the same problem you just experienced (i.e. everytime you need to do `choplast` plus something else, you'll end up traversing the list twice). Instead, every time you need to work on the end of a list, you should start by getting a reference to that end (presumably with `last` with an appropriate N) and then you work locally on that end. Stefan