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: optional argument defaults in `cl-defun' vs old way - warning, discrepancy! Date: Fri, 06 Oct 2023 04:30:54 +0200 Message-ID: <871qe832jl.fsf@dataswamp.org> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="11928"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) To: emacs-devel@gnu.org Cancel-Lock: sha1:Dm5egwIEaizoMJWX0FxvXJLdpzk= Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Fri Oct 06 06:43:34 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 1qocgY-0002w9-0s for ged-emacs-devel@m.gmane-mx.org; Fri, 06 Oct 2023 06:43:34 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qocfj-0007Kw-L3; Fri, 06 Oct 2023 00:42:43 -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 1qoacS-0007ev-Rp for emacs-devel@gnu.org; Thu, 05 Oct 2023 22:31:12 -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 1qoacQ-0003sT-Oo for emacs-devel@gnu.org; Thu, 05 Oct 2023 22:31:12 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1qoacM-0008oP-MC for emacs-devel@gnu.org; Fri, 06 Oct 2023 04:31:06 +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: -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-Mailman-Approved-At: Fri, 06 Oct 2023 00:42:42 -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:311318 Archived-At: The other day I said the CL way, as implemented in Elisp in cl-lib, was superior for setting the defaults for optional arguments, which is done with `cl-defun', as opposed to the old way, using `defun' and then `or', `unless', or `let' with a check for a nil value. That comment refered to the cl-defun syntax which, by all means, is more neat and compact. But it turns out, those methods are not equivalent - check out the code below! After changing 60 defun to cl-defun, maybe I have to change it all back since the Elisp way of thinking - where nil means "unset", i.e. use the default - that was the way I was thinking when I wrote the code, and it has worked ever since. And just now I run into an error which brought this all to my attention. But in a way the CL way is better even here, since explicit nil really means nil, so one could use that as an optional argument value. But then, how would that mix with other code, evaluating to nil and then being sent as argument. Is that an unset optional argument which should get a default value, or is it a set value, just as an explicit nil, only this time not written by a programmer, but computed by a program, written by a programmer? Bottom line, the Elisp way is preferable since it is consistent - see the three (1 2) results below, compared to the CL ditto, with one (1 2) and two (nil nil). ;;; -*- lexical-binding: t -*- ;; ;; this file: ;; https://dataswamp.org/~incal/emacs-init/geh.el (require 'cl-lib) (cl-defun test-opt-args-cl (&optional (one 1) (two 2)) (interactive (list nil nil)) (message "%s" (list one two)) ) ;; (test-opt-args-cl) ; (1 2) ;; (test-opt-args-cl nil nil) ; (nil nil) ;; (call-interactively #'test-opt-args-cl) ; (nil nil) (defun test-opt-args (&optional one two) (interactive (list nil nil)) (or one (setq one 1)) (or two (setq two 2)) (message "%s" (list one two)) ) ;; (test-opt-args) ; (1 2) ;; (test-opt-args nil nil) ; (1 2) ;; (call-interactively #'test-opt-args) ; (1 2) -- underground experts united https://dataswamp.org/~incal