返回列表没有常见的lisp中的最后一个元素

Ser*_*gey 4 list common-lisp

我编写了我的愚蠢函数,它返回一个没有常见lisp中最后一个元素的列表.这个问题还有更优雅的解决方案吗?

这是我的代码:

(defun list-without-last (l)
  (if (> (length (rest l)) 0)
      (append (list (first l)) (list-without-last (rest l)))
      nil))
Run Code Online (Sandbox Code Playgroud)

小智 11

简短,就像Lisp一样简单.这是神奇的东西:

(defun without-last(l) (reverse (cdr (reverse l))) )


Rai*_*wig 8

你的功能有两个问题:

  • 你正在使用LENGTH.LENGTH必须扫描整个列表.

  • 你正在使用APPEND.尝试使用CONS.CONS更简单.

Common Lisp也已经提供了这个功能.它被称为BUTLAST.

在实际代码中,我们也不会使用递归.堆栈大小将限制我们可以处理的列表的长度.

使用LOOP宏的迭代版本:

CL-USER> (defun my-butlast (list)
           (loop for l on list
                 while (rest l)
                 collect (first l)))
MY-BUTLAST                                                                                                                                      
CL-USER> (compile 'my-butlast)
MY-BUTLAST                                                                                                                                      
NIL                                                                                                                                             
NIL                                                                                                                                             
CL-USER> (my-butlast '(1 2 3 4 5))
(1 2 3 4)                                                                                                                                       
CL-USER> (my-butlast '(1))
NIL                                                                                                                                             
CL-USER> (my-butlast '(1 2))
(1)                                                                                                                                             
Run Code Online (Sandbox Code Playgroud)