summaryrefslogtreecommitdiff
path: root/lisp/subr.el
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1997-08-27 22:34:30 +0000
committerRichard M. Stallman <rms@gnu.org>1997-08-27 22:34:30 +0000
commit369fba5fb7725e65fd426032397fb854614a3ae9 (patch)
tree501e2bb11796ef833f15355e193cac1188236371 /lisp/subr.el
parent59966fb622614968b5faf8a006e2641772a628ba (diff)
downloademacs-369fba5fb7725e65fd426032397fb854614a3ae9.tar.gz
(last): Accept optional second argument.
Diffstat (limited to 'lisp/subr.el')
-rw-r--r--lisp/subr.el20
1 files changed, 14 insertions, 6 deletions
diff --git a/lisp/subr.el b/lisp/subr.el
index 513a63a2f21..cba1ed225ba 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -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))
;;;; Keymap support.