all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* optional argument defaults in `cl-defun' vs old way - warning, discrepancy!
@ 2023-10-06  2:30 Emanuel Berg
  2023-10-06  9:36 ` Adam Porter
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Emanuel Berg @ 2023-10-06  2:30 UTC (permalink / raw)
  To: emacs-devel

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




^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-10-07 13:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-06  2:30 optional argument defaults in `cl-defun' vs old way - warning, discrepancy! Emanuel Berg
2023-10-06  9:36 ` Adam Porter
2023-10-07 13:01   ` Emanuel Berg
2023-10-06 13:54 ` [External] : " Drew Adams
2023-10-07 13:12   ` Emanuel Berg
2023-10-06 21:37 ` Richard Stallman

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.