LAST and BUTLAST work for improper lists
authorDavid Vazquez <davazp@gmail.com>
Fri, 28 Dec 2012 01:37:07 +0000 (01:37 +0000)
committerDavid Vazquez <davazp@gmail.com>
Fri, 28 Dec 2012 01:37:07 +0000 (01:37 +0000)
lispstrack.lisp

index 5b71994..562f004 100644 (file)
       (t (nth (1- n) (cdr list)))))
 
   (defun last (x)
-    (if (null (cdr x))
-        x
-        (last (cdr x))))
+    (if (consp (cdr x))
+        (last (cdr x))
+        x))
 
   (defun butlast (x)
-    (if (null (cdr x))
-        nil
-        (cons (car x) (butlast (cdr x)))))
+    (and (consp (cdr x))
+         (cons (car x) (butlast (cdr x)))))
 
   (defun member (x list)
     (cond