我编写了我的愚蠢函数,它返回一个没有常见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)
你的功能有两个问题:
你正在使用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)