Якщо ви не використовуєте поширені розширення Lisp, як запропонував @legoscia, вам потрібно перевірити, чи вказаний необов'язковий аргумент. Зауважте, що вам не потрібно letтут користуватися. Мені це здається ідіоматичнішим:
(defun command (a &optional b)
(or b (setq b default))
(command-body a b))
Як запропоновано в коментарях, використання unlessможе бути кращим для or:
(defun command (a &optional b)
(unless b (setq b default))
(command-body a b))
Також з коментарів: більш чистим функціональним стилем було б користуватися let, як в оригінальному питанні, але вам не потрібні окремі назви змінних:
(defun my-command (a &optional b)
(let ((b (or b default)))
(command-body a b)))
Звичайно, якщо необов'язковий параметр потрібен лише один раз, ви повинні просто зробити це:
(defun my-command (a &optional b)
(command-body a (or b default)))
setqу "чистому" булевій формі, якor. На мою думку,whenтут, безумовно, більше підходить, але загаломletце вираження вибору встановити або змінити місцеві прив’язки. IOW, оригінальний код мені виглядає набагато приємніше.