从Lisp中的列表中删除最后两个元素

4 common-lisp

我需要从公用列表中的列表中删除最后两个元素,但只能删除一个。怎么了

(defun my-butlast (list)
        (loop for l on list
              while (rest l)
              collect (first l)))
Run Code Online (Sandbox Code Playgroud)

cor*_*ump 5

简单:反向,弹出,弹出,反向 ;-) 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