From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Tomas Hlavaty Newsgroups: gmane.emacs.help Subject: Re: Advantage using mapc over dolist Date: Tue, 03 Dec 2024 20:27:24 +0100 Message-ID: <87v7w04ler.fsf@neko.mail-host-address-is-not-set> References: <87zflevbwm.fsf@neko.mail-host-address-is-not-set> <87o71su8jz.fsf@neko.mail-host-address-is-not-set> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="7902"; mail-complaints-to="usenet@ciao.gmane.io" Cc: help-gnu-emacs@gnu.org To: Stefan Monnier , "Alfred M. Szmidt" Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Tue Dec 03 20:27:53 2024 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 1tIYYr-0001lz-8L for geh-help-gnu-emacs@m.gmane-mx.org; Tue, 03 Dec 2024 20:27:53 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tIYYj-0004ON-0P; Tue, 03 Dec 2024 14:27:45 -0500 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 1tIYYU-0004Hr-Ey for help-gnu-emacs@gnu.org; Tue, 03 Dec 2024 14:27:31 -0500 Original-Received: from logand.com ([37.48.87.44]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tIYYS-0007uQ-NZ; Tue, 03 Dec 2024 14:27:30 -0500 Original-Received: by logand.com (Postfix, from userid 1001) id 2A4661A0369; Tue, 3 Dec 2024 20:27:26 +0100 (CET) X-Mailer: emacs 29.4 (via feedmail 11-beta-1 I) In-Reply-To: Received-SPF: pass client-ip=37.48.87.44; envelope-from=tom@logand.com; helo=logand.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham 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:148555 Archived-At: On Tue 03 Dec 2024 at 12:24, Stefan Monnier wrote: >> > on the contrary, it is better to use specific tools and avoid more >> > general tools when possible in order to lower cognitive load. >> Again, that's a personal preference. If you have to learn the more >> general tool anyway, then having to additionally learn the more specific >> tool may increase rather than lower the cognitive load. >> Then why not use COND*? > > AFAICT, the "cognitive load" of a complex pattern language is about the > same for `pcase` as for `match*` since the two pattern languages are > very similar. > > And in the case of code that can use `case/ecase`, `cond*` doesn't seem > to provide much benefit over just `cond` or `pcase`. Compare: not only syntax but also semantics is important not only things that are possible are important but also things that are not possible very limited stuff can happen using case/ecase this is not the case with pcase so one has to keep in mind many more possibilities compare IF and WHEN. IF is more general and using your logic, one should use IF and forget WHEN. however, the reduction of cognitive load comes also from _things that cannot happen_, e.g. there is no "else" branch to watch out for when using WHEN. Thus writing (if x 42) is worse than writing (when x 42). It conveys the intention much better. And is more robust. > (pcase actm > ('armg (do-this)) > ('go (do-that)))) (let ((x 'go)) (pcase x ('armg 1) ('go 2))) => 2 (let ((x 'go)) (pcase x (armg 1) (go 2))) => 1 here the PATTERN leads to many more possibilities > (case actm > (armg (do-this)) > (go (do-that)))) (let ((x 'go)) (cl-case x ('armg 1) ('go 2))) => 2 (let ((x 'go)) (cl-case x (armg 1) (go 2))) => 2 here the KEYLIST leads to much less possibilities > (cond > ((eq actm 'armg (do-this))) > ((eq actm 'go (do-that)))) > > vs > > (cond* > ((eq actm 'armg) (do-this)) > ((eq actm 'go) (do-that))) > > or > > (cond* > ((match* `armg actm) (do-this))) > ((match* `go actm) (do-that)))) obviously these examples are significantly worse than CASE you meant: (cond ((eq actm 'armg) (do-this)) ((eq actm 'go) (do-that))) and cond is simpler and more specific than cond* so again, use simpler, more specific tool for the job and the code will be more readable and maintainable pushing for general omnipotent use-me-i-can-do-everything-youll-ever-need macro is a bad idea