From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Emanuel Berg Newsgroups: gmane.emacs.devel Subject: Re: Emacs design and architecture. How about copy-on-write? Date: Tue, 19 Sep 2023 21:34:49 +0200 Message-ID: <87o7hyx8h2.fsf@dataswamp.org> References: <83edizjn0v.fsf@gnu.org> <0518f65b-1dd1-6923-8497-da4d3aeac631@gutov.dev> <87sf7fc7kd.fsf@dataswamp.org> <834jjuk68t.fsf@gnu.org> <87cyyhc7uu.fsf@dataswamp.org> <83ttrsg9nx.fsf@gnu.org> <83h6nrg4eg.fsf@gnu.org> <83v8c7elan.fsf@gnu.org> <877conk5ny.fsf@localhost> <83ttrreeu0.fsf@gnu.org> <87bkdzeas1.fsf@localhost> <83cyyfe5l8.fsf@gnu.org> <8734zbyu6o.fsf@dataswamp.org> <835y46e8o9.fsf@gnu.org> <87zg1ixvnc.fsf@dataswamp.org> <87il86nxts.fsf@localhost> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="15487"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) To: emacs-devel@gnu.org Cancel-Lock: sha1:+JrUVEPcPUo8TxhcYyE4byv7rBY= Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Wed Sep 20 04:23:12 2023 Return-path: Envelope-to: ged-emacs-devel@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 1qimrw-0003op-Fi for ged-emacs-devel@m.gmane-mx.org; Wed, 20 Sep 2023 04:23:12 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qimqn-00084b-Dv; Tue, 19 Sep 2023 22:22:01 -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 1qigV9-0006Uy-2l for emacs-devel@gnu.org; Tue, 19 Sep 2023 15:35:15 -0400 Original-Received: from ciao.gmane.io ([116.202.254.214]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qigUt-0003N7-Mn for emacs-devel@gnu.org; Tue, 19 Sep 2023 15:35:14 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1qigUq-00027o-UK for emacs-devel@gnu.org; Tue, 19 Sep 2023 21:34:56 +0200 X-Injected-Via-Gmane: http://gmane.org/ Mail-Followup-To: emacs-devel@gnu.org Mail-Copies-To: never Received-SPF: pass client-ip=116.202.254.214; envelope-from=ged-emacs-devel@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-Mailman-Approved-At: Tue, 19 Sep 2023 22:21:59 -0400 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 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-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:310801 Archived-At: Ihor Radchenko wrote: > Because implementation details are tricky - a lot of Elisp > internal machinery is relying upon modifying global symbol > objects [...] Yeah, but that should be fine, as long as they are locked and unlocked safely, right? But, if one aspire to reduce the number of global variables used, a great way of doing that is lexical `let'-closures, here is an example that allows for the same default value when the function is called from Lisp and when used as an interactive command, yet the data is only hardcoded once for each variable. With this method - and not just for that use case, also the use case of 2 functions sharing a variable - one can reduce global Lisp variable use a lot - I know since I've done that do my own code, and it works great ever since. ;;; -*- lexical-binding: t -*- ;; ;; this file: ;; https://dataswamp.org/~incal/emacs-init/math.el (require 'cl-lib) ;; [...] (let ((min-def 0) (max-def 9) (inc-def 1) ) (cl-defun interval (&optional (min min-def) (max max-def) (inc inc-def) ) (interactive `(,(read-number "min: " min-def) ,(read-number "max: " max-def) ,(read-number "inc: " inc-def)) ) (unless (<= min max) (error "Bogus interval") ) (unless (> inc 0) (error "Bogus increment") ) (cl-loop for i from min to max by inc collect i) ) (declare-function interval nil) ) ;; (interval 10 5) ; Bogus interval ;; (interval 1 3 -1) ; Bogus increment ;; (interval 5 10) ; (5 6 7 8 9 10) ;; (interval 1.8 2.0 0.1) ; (1.8 1.9 2.0) ;; (interval) ; (0 1 2 3 4 5 6 7 8 9) ;; (interval 19 99) ; (19 20 21 ... 97 98 99) -- underground experts united https://dataswamp.org/~incal