From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Barry Fishman Newsgroups: gmane.emacs.devel Subject: Re: Instead of pcase Date: Sun, 19 Nov 2023 11:02:49 -0500 Message-ID: <7nmsv9zq6u.fsf@ecube.ecubist.org> References: <87fs169mjj.fsf@posteo.net> <093f11a1-57c2-5e56-d39b-26fef1c67cbb@gutov.dev> <25942.25061.217864.329049@retriever.mtv.corp.google.com> <87zfzdcz6z.fsf@posteo.net> <87zfza2aq2.fsf@web.de> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="9397"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) To: emacs-devel@gnu.org Cancel-Lock: sha1:wavZ8rR7LCvtoJt3lq4wlRu85wQ= Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun Nov 19 17:03:46 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 1r4kGw-0002Io-0K for ged-emacs-devel@m.gmane-mx.org; Sun, 19 Nov 2023 17:03:46 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r4kGF-0003b6-1E; Sun, 19 Nov 2023 11:03:03 -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 1r4kGC-0003ak-WA for emacs-devel@gnu.org; Sun, 19 Nov 2023 11:03:01 -0500 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 1r4kGB-0004CE-Cp for emacs-devel@gnu.org; Sun, 19 Nov 2023 11:03:00 -0500 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1r4kG8-00019Y-Q8 for emacs-devel@gnu.org; Sun, 19 Nov 2023 17:02:56 +0100 X-Injected-Via-Gmane: http://gmane.org/ 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.25, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action 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:312998 Archived-At: On 2023-11-19 13:23:17 +01, Michael Heerdegen wrote: > So, the advantage would be more of a psychological kind: you have normal > Lisp function calls, but structurally you have the same thing, and you > have to remember exactly the same set of details. The complexity comes > from the task, not from the implementation. I submit that the opposite is true, the complexity is in its implementation, not the task. In languages like Haskell this is expressed in a very simple way, so the task is not in itself hard to understand. For example, one implementation might be to use the form: (proto-case x (typeproto guard expressions...) ...) The typeproto would be a type, or a list made up of the type and a variable that could be use in the expression. The guard would be an expression which is required to be true before a match can be declared. Composite types like pair, list, vector, or list*, would have typeproto's for their arguments when they are expanded as a list): (proto-case x ((list string integer) t ...)) which would match a list of two element, the first a string, and the second an integer. The guard (t) would always consider it a match. The list arguments which are typeproto's themselves, could be made into assignments with using a list, as above. If x is a list with its first element a string "foo" and the second an integer, remove it from x and add the second element to total: (proto-case x ((list* (string name) (integer count) (t rest)) (string-equal name "foo") (set! total (+ total count)) (set! x rest))) This is just one of many other ways one could setup a matching expression in elisp, the best is a balance between implementation efficiency and readability. I think the complexity doesn't come from the task, but comes from the choice of implementation. So its the complexity of the implementation that should determines whether it is worth while implementing. Although back-quoting is part of Lisp, it was added to solve a specific problem, and unfortunately added new syntax tokens to Lisp, which it otherwise avoids. -- Barry Fishman