common-lisp - 从 Lisp 列表中删除最后两个元素

标签 common-lisp

我需要从公共(public)列表中的列表中删除最后两个元素,但我只能删除一个。有什么办法?

(defun my-butlast (list)
        (loop for l on list
              while (rest l)
              collect (first l)))

最佳答案

简单:反向、流行、流行、反向 ;-) 1

更有效的是,以下工作也有效:

(let ((list '(a b c d)))
  (loop 
    for x in list
    for y in (cddr list)
    collect x))

对于一些任意的 L 和 N,也可以这样写:
(mapcar #'values L (nthcdr N L)) 

它之所以有效,是因为对多个列表的迭代受到最短列表的限制。这里重要的是第二个列表的长度(我们不关心它的值),它是原始列表的长度减去 N,当该值为正时,否则为零。请注意 NTHCDR 方便地使用大于参数中给出的列表长度的大小。对于第二个示例,我使用 VALUES 用作广义恒等函数; MAPCAR 仅使用计算值的主值,因此可以按需要工作。
行为与实际 BUTLAST 一致 2 函数,返回 nil对于 N 大于列表中的元素数。实际BUTLAST函数也可以处理不正确的(点)列表,但上面的版本不能。

1. (alexandria:compose #'nreverse #'cddr #'reverse)
2. BUTLAST被指定为等同于 (ldiff list (last list n)) .我完全忘记了 LDIFF 的存在!

关于common-lisp - 从 Lisp 列表中删除最后两个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45229614/

相关文章:

authentication - 实现 SCRAM-SHA1 客户端,在某处出错

lisp - 有没有办法确定正在执行的文件所在的目录?

common-lisp - 宏: How to output a comma in a backquoted generated code?

lisp - 如何使用 quicklisp 安装的包?

lisp - 如何在 LISP 中列出从 1800 开始的所有闰年?

lisp - 如何在 Common Lisp 上正确传递参数?

lisp - 列表的 CLISP 表示

common-lisp - setq 与未声明的自由变量(常见的 lisp)

lisp - Common Lisp 模糊可搜索函数引用?

lisp - 无法更改列表