Якщо ви не використовуєте поширені розширення 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, оригінальний код мені виглядає набагато приємніше.