Kecuali Anda menggunakan ekstensi Common Lisp seperti yang disarankan oleh @legoscia, Anda perlu memeriksa apakah argumen opsional sudah ditentukan. Perhatikan bahwa Anda tidak perlu menggunakannya di letsini. Ini sepertinya lebih idiomatis bagi saya:
(defun command (a &optional b)
(or b (setq b default))
(command-body a b))
Seperti yang disarankan dalam komentar, menggunakan unlessmungkin lebih disukai daripada or:
(defun command (a &optional b)
(unless b (setq b default))
(command-body a b))
Juga dari komentar: gaya fungsional yang lebih murni akan digunakan let, seperti pada pertanyaan asli, tetapi Anda tidak perlu nama variabel yang terpisah:
(defun my-command (a &optional b)
(let ((b (or b default)))
(command-body a b)))
Tentu saja, jika parameter opsional hanya diperlukan sekali Anda harus melakukan ini:
(defun my-command (a &optional b)
(command-body a (or b default)))
setqdalam bentuk boolean "murni" sepertior. Menurut pendapat sayawhensudah pasti lebih tepat di sini, tetapi umumnyaletadalah ekspresi pilihan untuk membangun atau mengubah binding lokal. TKI, kode aslinya terlihat jauh lebih bagus untuk saya.