[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Extract sublists
From: |
Nordlöw |
Subject: |
Re: Extract sublists |
Date: |
Wed, 18 Nov 2009 03:16:35 -0800 (PST) |
User-agent: |
G2/1.0 |
On Nov 17, 4:37 pm, Ted Zlatanov <t...@lifelogs.com> wrote:
> On Tue, 17 Nov 2009 05:22:51 -0800 (PST) Nordlöw <per.nord...@gmail.com>
> wrote:
>
> N> Is there a function for extracting sublists of lists?
> N> If not here is my suggestion for inclusion in Emacs.
>
> N> (defun sublist (list from to)
> N> "Return a sublist of LIST, from FROM to TO.
> N> Counting starts at 0. Like `substring' but for lists."
> N> (let (rtn (c from))
> N> (setq list (nthcdr from list))
> N> (while (and list (< c to))
> N> (push (pop list) rtn)
> N> (setq c (1+ c)))
> N> (nreverse rtn)))
> N> ;; Use: (sublist '(a b) 0 0)
> N> ;; Use: (sublist '(a b) 0 1)
> N> ;; Use: (sublist '(a b) 1 2)
> N> ;; Use: (sublist '(a b) 0 2)
>
> It would be really nice if either FROM or TO could be a function or a
> number, so you can say "from 2 to the first place where the element
> passed to this function doesn't return t." This is not a filter because
> you look for the first place the function fails. Unfortunately it's
> efficient only if you walk through the list yourself so nthcdr won't be
> so useful.
>
> Ted
This gives superior performance in my benchmarks, thanks to very
little garbage collection.
For the case when to is nil it just returns (nthcdr from list) which I
hope is alright...
(defun sublist (list from &optional to)
"Return a sublist of LIST, from FROM to TO.
If END is omitted, it defaults to the length of the sequence.
Counting starts at 0. Like `subseq' and `substring' but solely for
lists."
(let ((start (nthcdr from list))) ;start reference
(if to (butlast start
(- (+ from (length start)) ;if extract list at the
end this makes it much faster
to))
start)))
/Nordlöw