Sofern Sie keine von @legoscia vorgeschlagenen Common Lisp-Erweiterungen verwenden, müssen Sie überprüfen, ob das optionale Argument angegeben wurde. Beachten Sie, dass Sie hier nicht wirklich verwenden müssen let
. Das scheint mir idiomatischer zu sein:
(defun command (a &optional b)
(or b (setq b default))
(command-body a b))
Wie in den Kommentaren vorgeschlagen, unless
kann die Verwendung von vorzuziehen sein, um or
:
(defun command (a &optional b)
(unless b (setq b default))
(command-body a b))
Auch aus den Kommentaren: Der reinere funktionale Stil wäre zu verwenden let
, wie in der ursprünglichen Frage, aber Sie brauchen keine separaten Variablennamen:
(defun my-command (a &optional b)
(let ((b (or b default)))
(command-body a b)))
Wenn der optionale Parameter nur einmal benötigt wird, sollten Sie dies natürlich einfach tun:
(defun my-command (a &optional b)
(command-body a (or b default)))
setq
in einer „reinen“ Booleschen Form wie zu verwendenor
. Meiner Meinung nachwhen
ist dies hier definitiv angemessener, aber im Allgemeinenlet
ist es der Ausdruck der Wahl, lokale Bindungen herzustellen oder zu ändern. IOW, der ursprüngliche Code sieht für mich viel besser aus.(unless b (setq b default)
besser sein könnte. Persönlich halte ich das hier fürlet
überflüssig, weilb
das schon lokal istdefun
.let
gegenüber einer nebenwirkenden Form wiesetq
. Es ist Code für einen Standardparameter, aber die großzügige Verwendungsetq
zum Ändern lokaler Variablen erschwert das Lesen und Verfolgen von Code. Ich denke, es ist am besten, alle lokalen Bindungen als unveränderlich zu betrachten und nur neue Bindungen mit einzurichtenlet
. IOW, bevorzugen Sie einen funktionalen Stil gegenüber einem imperativen.Sie können
cl-defun
Folgendes verwenden, um einen Standardwert für optionale Argumente anzugeben:Der Standardwert wird in diesem Fall
default-b
bei jedem Funktionsaufruf ausgewertet.quelle