Emacs Lisp不对可选参数的非null缺省值提供语法支持。提供这些参数的推荐惯用法是什么?
为了阐明我的观点,这是一种过于明确的方式。
(defun command (a &optional supplied-b)
(let ((b (or supplied-b default-b)))
(command-body a b)))
推荐的样式是什么(如果有的话)?
Emacs Lisp不对可选参数的非null缺省值提供语法支持。提供这些参数的推荐惯用法是什么?
为了阐明我的观点,这是一种过于明确的方式。
(defun command (a &optional supplied-b)
(let ((b (or supplied-b default-b)))
(command-body a b)))
推荐的样式是什么(如果有的话)?
Answers:
除非使用@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)))
当然,如果仅需要一次使用可选参数,则应该执行以下操作:
(defun my-command (a &optional b)
(command-body a (or b default)))
(unless b (setq b default)
可能会更好。我个人认为这let
是多余的,因为b
它已经本地化了defun
。
let
而不是像这样的副作用形式setq
。它是用于参数默认值的代码,但是大量使用setq
来更改局部变量使代码难以阅读和遵循。我认为最好考虑所有本地绑定都是不可变的,并且只能使用建立新的绑定let
。IOW比命令式更喜欢一种功能样式。
setq
“纯”布尔形式)的好风格or
。我认为when
这里肯定更合适,但通常let
是建立或更改本地绑定的选择表达。IOW,原始代码对我来说更好。