在Common Lisp中获取列表的前n个元素?

17 lisp list common-lisp

我如何获得n列表的第一个元素?

CL-USER> (equal (some-function 2 '(1 20 300))
                '(1 20))
T
Run Code Online (Sandbox Code Playgroud)

我绝对肯定这是基本的,但帮助一个兄弟newb out.

Pil*_*lsy 30

检查SUBSEQ功能.

* (equal (subseq '(1 20 300) 0 2)
         '(1 20))
T
Run Code Online (Sandbox Code Playgroud)

它可能不会立即显而易见,但在Lisp中,索引从0开始,并且您总是采用半开间隔,因此这将使列表中的所有元素具有区间[0,2]中的索引.

  • 这有一个不幸的限制,即如果序列小于结束索引,它将在运行时失败*,这是一个遗憾,因为要求前面的长度是非常低效的.那么如何处理这种情况呢? (3认同)
  • @DiegoSevilla 有时,当您的列表中没有足够的元素时,代码在运行时会失败,这正是您正在寻找的行为。许多惯用的 Common Lisp 代码使用 conses 构建固定大小的数据结构,而不是使用 `DEFCLASS` 或 `DEFSTRUCT`,在这些情况下,如果你没有足够的元素,立即投入调试器是最好的可能发生在你身上的事情。 (2认同)

Ken*_*Ken 5

上面的答案当然是完全正确的,但请注意,如果您只是将其用于与另一个列表进行比较,那么将这两个列表就地放在一起会更具性能效率,而不是为了比较而建立一个新列表.

例如,在上述情况下,您可能会说:

(every #'= '(1 20 300) '(1 20))
=> t
Run Code Online (Sandbox Code Playgroud)

爱,