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 let
sini. 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 unless
mungkin 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)))
setq
dalam bentuk boolean "murni" sepertior
. Menurut pendapat sayawhen
sudah pasti lebih tepat di sini, tetapi umumnyalet
adalah ekspresi pilihan untuk membangun atau mengubah binding lokal. TKI, kode aslinya terlihat jauh lebih bagus untuk saya.