From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Marcin Borkowski Newsgroups: gmane.emacs.help Subject: Re: [Elisp][Question] How to modify a list by index while preserving value outside of scope? Date: Sun, 20 Aug 2023 07:38:20 +0200 Message-ID: <87jztqjmsz.fsf@mbork.pl> References: Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="16052"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: mu4e 1.1.0; emacs 30.0.50 Cc: help-gnu-emacs@gnu.org To: Rodrigo Morales Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Sun Aug 20 07:39:39 2023 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 1qXbA3-0003zf-0g for geh-help-gnu-emacs@m.gmane-mx.org; Sun, 20 Aug 2023 07:39:39 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qXb9I-0001x2-VX; Sun, 20 Aug 2023 01:38:53 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qXb8z-0001wa-Mo for help-gnu-emacs@gnu.org; Sun, 20 Aug 2023 01:38:35 -0400 Original-Received: from mail.mojserwer.eu ([195.110.48.8]) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qXb8w-0003zw-Q0 for help-gnu-emacs@gnu.org; Sun, 20 Aug 2023 01:38:33 -0400 Original-Received: from localhost (localhost [127.0.0.1]) by mail.mojserwer.eu (Postfix) with ESMTP id 83A97976BED; Sun, 20 Aug 2023 07:38:25 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail.mojserwer.eu Original-Received: from mail.mojserwer.eu ([127.0.0.1]) by localhost (mail.mojserwer.eu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id E_O2ogQiY1iN; Sun, 20 Aug 2023 07:38:21 +0200 (CEST) Original-Received: from localhost (178235147023.dynamic-3-poz-k-0-1-0.vectranet.pl [178.235.147.23]) by mail.mojserwer.eu (Postfix) with ESMTPSA id 7602FE81718; Sun, 20 Aug 2023 07:38:20 +0200 (CEST) In-reply-to: Received-SPF: pass client-ip=195.110.48.8; envelope-from=mbork@mbork.pl; helo=mail.mojserwer.eu X-Spam_score_int: 7 X-Spam_score: 0.7 X-Spam_bar: / X-Spam_report: (0.7 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.help:144886 Archived-At: On 2023-08-20, at 05:46, Rodrigo Morales wrote: > ---- > (defun my/f (foo bar) > (princ (format "(foo: %s) (bar: %s)\n" foo bar)) > (cond > (foo (setf (nth 0 bar) "100")) > (t (my/f "apples" bar) > (my/f "bananas" bar)))) > > (my/f nil (list 123)) > ---- > > --- > (foo: nil) (bar: (123)) > (foo: apples) (bar: (123)) > (foo: bananas) (bar: (100)) > --- > > I have some questions: > > + The second time my/f function is called (i.e. when "apples" is > passed), `bar' equals `123'. The third time `my/f' is called > (i.e. when "bananas" is passed), `bar' has a different value. We can > conclude that the modification to `bar' in the second call affected > the third call. How is this possible? `bar' is an argument of `my/f', > as far as I'm concerned, any modification to a variable that is a > function parameter only affects the scope of the function. > + This is a minimal working example, in reality, the code I'm writing is > more complex. In the code that I'm writing, `bar' is a list and I want > to modify some of their elements by index. The only way I know is by > using `(setf (nth index my-list) new-value)'. However, using this > method seems to changes the value of the variable outside of the > function call. Are there any other ways to modify a list by index > without affecting its value outside of the function call? Welcome to the rabbit hole of conses, lists etc. In short: a "list" is in fact a "pointer", i.e., an "adress in memory" where the first cons of that list lives. (Read the chapter "How Lists are Implemented" in the Elisp Intro for more info.) If you want to work on a "local" version of a list, you can copy that list yourself. `append' is one way to do it; `cl-copy-list' is another. Hth, -- Marcin Borkowski http://mbork.pl