unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#7174: 23.2; `last' can be made faster by using `length'
@ 2010-10-08  1:31 IRIE Shinsuke
  2010-10-13  3:30 ` Glenn Morris
  0 siblings, 1 reply; 14+ messages in thread
From: IRIE Shinsuke @ 2010-10-08  1:31 UTC (permalink / raw)
  To: 7174

Recently I saw the implementation of `last' in subr.el and found that
it counts the number of list elements on its own:

(defun last (list &optional n)
  "Return the last link of LIST.  Its car is the last element.
If LIST is nil, return nil.
If N is non-nil, return the Nth-to-last link of LIST.
If N is bigger than the length of LIST, return LIST."
  (if n
      (let ((m 0) (p list))
	(while (consp p)
	  (setq m (1+ m) p (cdr p)))
	(if (<= n 0) p
	  (if (< n m) (nthcdr (- m n) list) list)))
    (while (consp (cdr list))
      (setq list (cdr list)))
    list))

So I modified the code to use `length' as follows, and confirmed
it becomes much faster:

(defun last (list &optional n)
  "Return the last link of LIST.  Its car is the last element.
If LIST is nil, return nil.
If N is non-nil, return the Nth-to-last link of LIST.
If N is bigger than the length of LIST, return LIST."
  (if n
      (and (> n 0)
	   (let ((m (length list)))
	     (if (< n m) (nthcdr (- m n) list) list)))
    (and list
	 (nthcdr (1- (length list)) list))))

Furthermore, the code can be made much simpler (but slower than
the above, in particular cases) as:

(defun last (list &optional n)
  "Return the last link of LIST.  Its car is the last element.
If LIST is nil, return nil.
If N is non-nil, return the Nth-to-last link of LIST.
If N is bigger than the length of LIST, return LIST."
  (nthcdr (- (length list) (or n 1)) list))

Thanks.

IRIE Shinsuke





^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2010-10-14  4:35 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-08  1:31 bug#7174: 23.2; `last' can be made faster by using `length' IRIE Shinsuke
2010-10-13  3:30 ` Glenn Morris
2010-10-13 22:25   ` Juanma Barranquero
2010-10-13 22:48     ` Glenn Morris
2010-10-13 22:52       ` Juanma Barranquero
2010-10-13 22:56         ` Glenn Morris
2010-10-13 23:16           ` Juanma Barranquero
2010-10-13 23:29             ` Glenn Morris
2010-10-13 23:44               ` Juanma Barranquero
2010-10-13 23:29             ` IRIE Shinsuke
2010-10-13 23:00     ` IRIE Shinsuke
2010-10-13 23:30       ` Glenn Morris
2010-10-13 23:45         ` Juanma Barranquero
2010-10-14  4:35         ` IRIE Shinsuke

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).