A menos que use extensiones Common Lisp como lo sugiere @legoscia, debe verificar si se especificó el argumento opcional. Tenga en cuenta que realmente no necesita usar let
aquí. Esto me parece más idiomático:
(defun command (a &optional b)
(or b (setq b default))
(command-body a b))
Como se sugiere en los comentarios, el uso unless
puede ser preferible a or
:
(defun command (a &optional b)
(unless b (setq b default))
(command-body a b))
También de los comentarios: el estilo funcional más puro sería usar let
, como en la pregunta original, pero no necesita nombres de variables separados:
(defun my-command (a &optional b)
(let ((b (or b default)))
(command-body a b)))
Por supuesto, si el parámetro opcional solo se necesita una vez, simplemente debe hacer esto:
(defun my-command (a &optional b)
(command-body a (or b default)))
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.