Без предложенных @tobin расширений Common Lisp нужно проверять, был ли передан необязательный аргумент. Учтите, что let здесь на самом деле не нужен. Такой вариант кажется мне более идиоматичным:
(defun perform (entry &optional extra)
(or extra (setq extra fallback))
(perform-body entry extra))
В комментариях предложили, что unless может быть предпочтительнее or:
(defun perform (entry &optional extra)
(unless extra (setq extra fallback))
(perform-body entry extra))
Ещё одна мысль из комментариев: более чистый функциональный вариант использует let, как в вопросе, но не требует двух разных имён:
(defun my-perform (entry &optional extra)
(let ((extra (or extra fallback)))
(perform-body entry extra)))
Конечно, если необязательный аргумент используется лишь однажды, можно просто написать:
(defun my-perform (entry &optional extra)
(perform-body entry (or extra fallback)))
Переведено с английского·Показать оригиналWithout the Common Lisp additions @tobin suggested, you have to test whether an optional argument was provided. Note that a let isn't actually necessary in this situation. I'd find this version more idiomatic:
(defun perform (entry &optional extra)
(or extra (setq extra fallback))
(perform-body entry extra))
The comments suggest that unless could be a better choice than or:
(defun perform (entry &optional extra)
(unless extra (setq extra fallback))
(perform-body entry extra))
Another point from the comments: a more purely functional approach uses let, like the question does, without needing two different names:
(defun my-perform (entry &optional extra)
(let ((extra (or extra fallback)))
(perform-body entry extra)))
Naturally, when the optional argument occurs only once, you can simply write:
(defun my-perform (entry &optional extra)
(perform-body entry (or extra fallback)))