我正在寻找一种方法来提取常见的lisp中列表的所有元素。喜欢这个
[194]> (break-out-of-list '(a b c d))
A
B
C
D
编辑:我给出的用法示例并没有很好地考虑,但我仍然很好奇是否有可能突破列表,如上例所示。
答案 0 :(得分:5)
您演示的内容似乎是如何将列表元素作为多个值的问题:
CL-USER> (values 1 2 3)
1
2
3
CL-USER> (apply #'values '(1 2 3))
1
2
3
另请参阅超标准中的multiple-value-bind
和nth-value
。
答案 1 :(得分:2)
当然,只需使用apply
:
(defun wraptest (&rest arguments)
(apply #'test arguments))
这在技术上并没有“突破名单”;它只是使用列表的元素作为函数调用的参数。
(免责声明:我是Schemer,而不是Common Lisper,并且可能有更惯用的方式在CL中获得相同的结果。)
答案 2 :(得分:2)
虽然(apply #'values '(1 2 3))
有效,但还有一个名为values-list
的函数,其使用如下:
(values-list '(1 2 3))
它有相同的结果。
答案 3 :(得分:1)
我想你可能正在寻找这个:
http://cl-cookbook.sourceforge.net/macros.html#LtohTOCentry-2
这主要是反引号。只有两个额外的 要指出的项目。首先,如果你写“,@ e”而不是“,e”那么 e的值被拼接到结果中。所以如果v =(哦男孩),那么`(zap ,@ v,v)评价为(zap oh boy(哦,boy))。第二次出现v 被其值取代。第一个被它的元素所取代 值。如果v有值(),它将完全消失: (zap,@ v,v)的值应该是(zap()),它与...相同 (zap nil)。
阅读你的评论:
(some-macro(break-list'(a b c d)))相当于(some-macro'a'b'c'd)
有了这个,你可以这样做:
`(some-macro ,@'(a b c d))
你会得到:
(some-macro a b c d)