Common lisp 在Lisp中将关键字参数转换为关联列表

Common lisp 在Lisp中将关键字参数转换为关联列表,common-lisp,Common Lisp,如果我有一个函数或宏(我将使用宏)使用一些关键字参数,例如: (defmacro mwe (&whole args &key name description &allow-other-keys) (pushnew (list-to-alist args) *some-var*)) 如果我想说的是,mwe的所有用途将采用以下形式: (mwe :name name :prop1 value1 :prop2 value2) 如何使用assoc?将其轻松转换为一个列表(

如果我有一个函数或宏(我将使用宏)使用一些关键字参数,例如:

(defmacro mwe (&whole args &key name description &allow-other-keys)
  (pushnew (list-to-alist args) *some-var*))
如果我想说的是,mwe的所有用途将采用以下形式:

(mwe :name name :prop1 value1 :prop2 value2)
如何使用
assoc

将其轻松转换为一个列表(或者一个哈希表,但我认为对于2-10个字段来说,这将是过分的)以便于检索关键字参数呢

但我想听听有什么改进或更好的方法来处理这个案子。我可以接受以完全不同的方式处理
&整个
/
&键
情况的答案,如果它更有意义的话。

我目前正在使用此选项(假设列表始终为偶数):


但我想听听有什么改进或更好的方法来处理这个案子。我可以接受以完全不同的方式处理
&whole
/
&key
情况的答案,如果它更有意义的话。

您可以使用
GETF
访问属性列表中的键/值元素:

CL-USER 19 > (getf '(:name name :prop1 value1 :prop2 value2)
                   :prop2)
VALUE2
要将特性列表转换为关联列表,请使用例如:

CL-USER 18 > (loop for (parameter value)
                     on '(:name name :prop1 value1 :prop2 value2)
                     by #'cddr
                   collect (cons parameter value))
((:NAME . NAME) (:PROP1 . VALUE1) (:PROP2 . VALUE2))

您可以使用
GETF
访问属性列表中的键/值元素:

CL-USER 19 > (getf '(:name name :prop1 value1 :prop2 value2)
                   :prop2)
VALUE2
要将特性列表转换为关联列表,请使用例如:

CL-USER 18 > (loop for (parameter value)
                     on '(:name name :prop1 value1 :prop2 value2)
                     by #'cddr
                   collect (cons parameter value))
((:NAME . NAME) (:PROP1 . VALUE1) (:PROP2 . VALUE2))

如果你只是想简单地检索,那么就用
GETF
&REST
参数怎么样?@jkiiski我真的没有想到
GETF
。如你所见,这是我公认的答案。另外,不确定这是否是一个不同的问题…,但我如何才能让emacs/SLIME知道一些关于自动补全的强制关键参数呢?我想我更愿意选择
&WHOLE
选项。@ssice您可以有一个类似
(&rest args&key name description)
的参数列表。这样,给定的关键字参数将出现在rest参数中,但slime仍会显示它们。如果您只是想轻松检索,那么使用
GETF
&rest
参数如何?@jkiiski我真的没有想到
GETF
'。如你所见,这是我公认的答案。另外,不确定这是否是一个不同的问题…,但我如何才能让emacs/SLIME知道一些关于自动补全的强制关键参数呢?我想我更愿意选择
&WHOLE
选项。@ssice您可以有一个类似
(&rest args&key name description)
的参数列表。这样,给定的关键字参数将出现在rest参数中,但slime仍将显示它们。这还假设列表的排序足以让您递归。在Common Lisp中不需要尾部递归优化。如果您是说short,我在OP中确实指出了这一点。无论如何,这里没有尾部递归,递归的结果不会立即返回,它被用作
cons
的第二个参数。这还假设列表的排序足以让您递归。在Common Lisp中不需要尾部递归优化。如果你是说short,我在OP中确实说过。无论如何,这里没有尾部递归,递归的结果不会立即返回,它被用作
cons
的第二个参数。