Trừ khi bạn sử dụng các tiện ích mở rộng Lisp chung như được đề xuất bởi @legoscia, bạn cần kiểm tra xem đối số tùy chọn có được chỉ định không. Lưu ý rằng bạn không thực sự cần sử dụng letở đây. Điều này có vẻ thành ngữ hơn đối với tôi:
(defun command (a &optional b)
(or b (setq b default))
(command-body a b))
Theo đề xuất trong các ý kiến, sử dụng unlesscó thể thích hợp hơn or:
(defun command (a &optional b)
(unless b (setq b default))
(command-body a b))
Cũng từ các ý kiến: phong cách chức năng thuần túy hơn sẽ được sử dụng let, như trong câu hỏi ban đầu, nhưng bạn không cần các tên biến riêng biệt:
(defun my-command (a &optional b)
(let ((b (or b default)))
(command-body a b)))
Tất nhiên, nếu tham số tùy chọn chỉ cần một lần, bạn chỉ nên làm điều này:
(defun my-command (a &optional b)
(command-body a (or b default)))
setqtrong một hình thức boolean tinh khiết như thếor. Theo tôiwhenchắc chắn là thích hợp hơn ở đây, nhưng nói chungletlà biểu hiện của sự lựa chọn để thiết lập hoặc thay đổi các ràng buộc địa phương. IOW, mã ban đầu trông đẹp hơn nhiều đối với tôi.