&allow-other-keys ,它有什么作用? - 普通口齿不清
&allow-other-keys , What does it do? - Common Lisp
我很想知道 &allow-other-keys
应该做什么。当我查阅所有我能得到的文档时,我得到的参考文献少得惊人,而且没有真正的定义。我能弄清楚的是,它实际上是一个错误处理代码位,您可以在 &key 之后放置代码,以在调用宏时禁止检查关键参数。作为参考,这是我找到它的地方:
(defmacro macro-name ((passed-variable
&rest open-args
&key &allow-other-keys)
&body body)
...)
&allow-other-keys
有据可查:它禁止关键字参数检查。
在您的示例中,它使 (macro-name (foo :bar 1) ...)
成为可接受的 macro-name
调用。
虽然我认为 sds 的答案是正确的,但也许值得举一个例子,这可能是 &allow-other-keys
:
的典型用例
(defun open-unsigned-byte (f &rest kws &key &allow-other-keys)
(apply #'open f :element-type 'unsigned-byte kws))
这个函数想要让 open
拥有它需要的任何关键字参数,可能包括非标准参数,但想要确保元素类型是 unsigned-byte
,并且所有的传递给 open
的附加参数是 关键字参数。这是可行的,因为在重复关键字参数(合法)的情况下,最左边的获胜。
我很想知道 &allow-other-keys
应该做什么。当我查阅所有我能得到的文档时,我得到的参考文献少得惊人,而且没有真正的定义。我能弄清楚的是,它实际上是一个错误处理代码位,您可以在 &key 之后放置代码,以在调用宏时禁止检查关键参数。作为参考,这是我找到它的地方:
(defmacro macro-name ((passed-variable
&rest open-args
&key &allow-other-keys)
&body body)
...)
&allow-other-keys
有据可查:它禁止关键字参数检查。
在您的示例中,它使 (macro-name (foo :bar 1) ...)
成为可接受的 macro-name
调用。
虽然我认为 sds 的答案是正确的,但也许值得举一个例子,这可能是 &allow-other-keys
:
(defun open-unsigned-byte (f &rest kws &key &allow-other-keys)
(apply #'open f :element-type 'unsigned-byte kws))
这个函数想要让 open
拥有它需要的任何关键字参数,可能包括非标准参数,但想要确保元素类型是 unsigned-byte
,并且所有的传递给 open
的附加参数是 关键字参数。这是可行的,因为在重复关键字参数(合法)的情况下,最左边的获胜。