Emacs Lisp no tiene soporte sintáctico para valores predeterminados no nulos de parámetros opcionales. ¿Cuál es el idioma recomendado para suministrar estos parámetros?
Para aclarar mi punto, aquí hay una forma demasiado explícita de hacerlo.
(defun command (a &optional supplied-b)
(let ((b (or supplied-b default-b)))
(command-body a b)))
¿Cuál, en todo caso, es el estilo recomendado?
setq
en una forma booleana "pura" comoor
. En mi opinión,when
es definitivamente más apropiado aquí, pero generalmentelet
es la expresión de elección para establecer o cambiar enlaces locales. IOW, el código original me parece mucho más agradable.(unless b (setq b default)
podría ser mejor. Personalmente, creo quelet
es redundante aquí porqueb
ya es local para eldefun
.let
sobre una forma de efectos secundarios comosetq
. Es el código para un parámetro predeterminado, pero el uso liberal desetq
cambiar las variables locales hace que el código sea difícil de leer y seguir. Creo que es mejor considerar todos los enlaces locales inmutables, y solo establecer nuevos enlaces conlet
. IOW, prefiera un estilo funcional sobre uno imperativo.Puede usar
cl-defun
, lo que le permite especificar un valor predeterminado para argumentos opcionales:El valor predeterminado, en este caso
default-b
, se evaluará cada vez que se llame a la función.fuente