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 unless
có 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)))
setq
trong một hình thức boolean tinh khiết như thếor
. Theo tôiwhen
chắc chắn là thích hợp hơn ở đây, nhưng nói chunglet
là 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.