有没有办法提取列表中的所有元素

时间:2011-11-23 14:27:42

标签: list lisp common-lisp

我正在寻找一种方法来提取常见的lisp中列表的所有元素。喜欢这个

[194]> (break-out-of-list '(a b c d))
A
B
C
D

编辑:我给出的用法示例并没有很好地考虑,但我仍然很好奇是否有可能突破列表,如上例所示。

4 个答案:

答案 0 :(得分:5)

您演示的内容似乎是如何将列表元素作为多个值的问题:

CL-USER> (values 1 2 3)
1
2
3
CL-USER> (apply #'values '(1 2 3))
1
2
3

另请参阅超标准中的multiple-value-bindnth-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)