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
的第二个参数。