@legosciaが提案するCommon Lisp拡張機能を使用しない限り、オプションの引数が指定されているかどうかを確認する必要があります。ここで実際に使用する必要はないことに注意してくださいlet
。これは私にとってより慣用的なようです:
(defun command (a &optional b)
(or b (setq b default))
(command-body a b))
コメントで示唆されているように、使用unless
することが望ましい場合がありますor
:
(defun command (a &optional b)
(unless b (setq b default))
(command-body a b))
また、コメントから:より純粋な機能スタイルはlet
、元の質問のようにを使用することですが、別個の変数名は必要ありません:
(defun my-command (a &optional b)
(let ((b (or b default)))
(command-body a b)))
もちろん、オプションのパラメーターが必要なのが1回だけの場合は、次のようにします。
(defun my-command (a &optional b)
(command-body a (or b default)))
setq
「純粋な」ブール形式のような副作用のある表現を使用するのは良いスタイルだとは思いませんor
。私の意見でwhen
は、ここでは間違いなくより適切ですが、一般let
に、ローカルバインディングを確立または変更するための選択の表現です。IOW、元のコードは私にとってはるかに良く見えます。