From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Emanuel Berg via Users list for the GNU Emacs text editor Newsgroups: gmane.emacs.help Subject: Re: Closures in Emacs and their usage scenarios. Date: Tue, 28 Sep 2021 04:50:12 +0200 Message-ID: <87bl4do1ln.fsf@zoho.eu> References: Reply-To: Emanuel Berg Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="33730"; 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:MAEbT79MThdg1hiSjZvI0ngUwpg= Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Tue Sep 28 04:51:32 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 1mV3DQ-0008d4-0Q for geh-help-gnu-emacs@m.gmane-mx.org; Tue, 28 Sep 2021 04:51:32 +0200 Original-Received: from localhost ([::1]:54356 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mV3DO-0000n1-GS for geh-help-gnu-emacs@m.gmane-mx.org; Mon, 27 Sep 2021 22:51:30 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:35900) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mV3CK-0000mm-2e for help-gnu-emacs@gnu.org; Mon, 27 Sep 2021 22:50:26 -0400 Original-Received: from ciao.gmane.io ([116.202.254.214]:60132) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mV3CI-00062X-El for help-gnu-emacs@gnu.org; Mon, 27 Sep 2021 22:50:23 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1mV3CG-0007E5-Ol for help-gnu-emacs@gnu.org; Tue, 28 Sep 2021 04:50:20 +0200 X-Injected-Via-Gmane: http://gmane.org/ Mail-Followup-To: help-gnu-emacs@gnu.org Mail-Copies-To: never 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: -15 X-Spam_score: -1.6 X-Spam_bar: - X-Spam_report: (-1.6 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.25, 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:133313 Archived-At: Hongyi Zhao wrote: > I noticed the document on closure here [1] implemented in > Emacs/Elisp currently. But it's only a very concise and > short introduction, and I want to know more about the > closures in Emacs and their usage scenarios. Any helpful > tips are welcome. > > [1] https://www.gnu.org/software/emacs/manual/html_node/elisp/Closures.html As a part of the language, or perhaps how the language is implemented, I can't say I understand it, but from the Joe Hacker perspective it is understandable enough, it can be used so a function (or set of functions) will have a memory and can use the variables that are part of that memory like global variables, even tho they aren't and are protected from outside interference, so that, for example, they wont be reset between function calls ... Here is one example - note that the byte-compiler will warn that "the function ‘align-from-left’ is not known to be defined." Well, OK. There is a better/easier example, an example with a counter, and then three functions within the `let' body, the let holds the counter value and the functions are "increase", "decrease", and "reset". Maybe one wants a "print" function as well? OK, so four functions. ikr? smells like OO spirit ... ;;; -*- lexical-binding: t -*- ;;; ;;; this file: ;;; https://dataswamp.org/~incal/emacs-init/align-from-left.el (require 'cl-lib) (let ((alf-regexp)) (defun align-from-left (&optional set-regexp) (interactive "p") (let ((default-regexp "^\\|[[:punct:]]\\|[[:space:]][[:alnum:]]")) (unless (stringp set-regexp) (cl-case set-regexp ( 4 (setq alf-regexp (read-regexp "regexp: "))) (16 (setq alf-regexp default-regexp)) ( t (unless alf-regexp (setq alf-regexp default-regexp) ))))) (let ((beg (point)) (re (or (and (stringp set-regexp) set-regexp) alf-regexp) )) (when (re-search-backward re (line-beginning-position) t) (while (looking-at "[[:space:]]") (forward-char 1) ) (insert (make-string (- beg (point)) ?\s)) )))) (defalias 'alf #'align-from-left) (provide 'align-from-left) -- underground experts united https://dataswamp.org/~incal