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 letaquí. 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 unlesspuede 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)))
setqen una forma booleana "pura" comoor. En mi opinión,whenes definitivamente más apropiado aquí, pero generalmenteletes la expresión de elección para establecer o cambiar enlaces locales. IOW, el código original me parece mucho más agradable.