我需要从公用列表中的列表中删除最后两个元素,但只能删除一个。怎么了
(defun my-butlast (list)
(loop for l on list
while (rest l)
collect (first l)))
Run Code Online (Sandbox Code Playgroud)
简单:反向,弹出,弹出,反向 ;-) 1
更有效地,以下工作也可以:
(let ((list '(a b c d)))
(loop
for x in list
for y in (cddr list)
collect x))
Run Code Online (Sandbox Code Playgroud)
对于任意的L和N,也可以这样写:
(mapcar #'values L (nthcdr N L))
Run Code Online (Sandbox Code Playgroud)
之所以起作用,是因为对多个列表的迭代以最短的列表为界。此处重要的是第二个列表的长度(我们不在乎它的值),这是原始列表的长度减去N(当该值为正时),否则为零。注意,NTHCDR方便地使用大于参数中给出的列表长度的大小。在第二个示例中,我将该VALUES函数用作广义标识函数;MAPCAR仅使用计算值的主值,因此可以按需工作。该行为与实际的2函数一致,该函数返回的N大于列表中元素的数量。实际功能还可以处理不正确的(点缀)列表,但是上述版本不能。BUTLASTnilBUTLAST
1。 (alexandria:compose #'nreverse #'cddr #'reverse)
2. BUTLAST被指定为等效于(ldiff list (last list n))。我完全忘记了存在LDIFF!