(last): Accept optional second argument.
authorRichard M. Stallman <rms@gnu.org>
Wed, 27 Aug 1997 22:34:30 +0000 (22:34 +0000)
committerRichard M. Stallman <rms@gnu.org>
Wed, 27 Aug 1997 22:34:30 +0000 (22:34 +0000)
lisp/subr.el

index 513a63a..cba1ed2 100644 (file)
@@ -79,12 +79,20 @@ BODY should be a list of lisp expressions."
   "Return the cdr of the cdr of X."
   (cdr (cdr x)))
 
-(defun last (x)
-  "Return the last element of the list X.
-If X is nil, return nil."
-  (while (cdr x)
-    (setq x (cdr x)))
-  x)
+(defun last (x &optional n)
+  "Return the last link of the list X.  Its car is the last element.
+If X is nil, return nil.
+If N is non-nil, return the Nth-to-last link of X.
+If N is bigger than the length of X, return X."
+  (if n
+      (let ((m 0) (p x))
+       (while (consp p)
+         (setq m (1+ m) p (cdr p)))
+       (if (<= n 0) p
+         (if (< n m) (nthcdr (- m n) x) x)))
+    (while (cdr x)
+      (setq x (cdr x)))
+    x))
 \f
 ;;;; Keymap support.