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: Closures in Emacs and their usage scenarios. Date: Wed, 29 Sep 2021 00:04:49 -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="23517"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) To: help-gnu-emacs@gnu.org Cancel-Lock: sha1:zr5ThxXTZvUbZV3JV80tC4mFDYY= Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Wed Sep 29 06:06:37 2021 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 1mVQrd-0005vY-De for geh-help-gnu-emacs@m.gmane-mx.org; Wed, 29 Sep 2021 06:06:37 +0200 Original-Received: from localhost ([::1]:52330 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mVQrc-0001Nj-2b for geh-help-gnu-emacs@m.gmane-mx.org; Wed, 29 Sep 2021 00:06:36 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:40176) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mVQq4-0001NV-Fl for help-gnu-emacs@gnu.org; Wed, 29 Sep 2021 00:05:00 -0400 Original-Received: from ciao.gmane.io ([116.202.254.214]:54288) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mVQq2-0000xl-Rl for help-gnu-emacs@gnu.org; Wed, 29 Sep 2021 00:05:00 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1mVQpy-0003cf-Lq for help-gnu-emacs@gnu.org; Wed, 29 Sep 2021 06:04:54 +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 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.23 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:133370 Archived-At: > (let ((direction 'up)) > (defun toggle-counter-direction () > (setq direction > (if (eq direction 'up) > 'down > 'up))) > > (defun counter-class () > (let ((counter 0)) > (lambda () > (if (eq direction 'up) > (incf counter) > (decf counter)))))) Note that in real life closures that share some of their environment with another closure are quite rare. And captured variables that are mutated are also quite rare (and in languages like Haskell or OCaml they can't exist since variables aren't mutable ;-). So I don't find such examples very useful to teach closures. Stefan