From: Nordlöw <per.nordlow@gmail.com>
To: help-gnu-emacs@gnu.org
Subject: Re: Extract sublists
Date: Wed, 18 Nov 2009 03:16:35 -0800 (PST) [thread overview]
Message-ID: <83d9ac73-7e7f-4562-837a-f81b154ea232@m38g2000yqd.googlegroups.com> (raw)
In-Reply-To: 87skcdf9gx.fsf@lifelogs.com
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
next prev parent reply other threads:[~2009-11-18 11:16 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-17 13:22 Extract sublists Nordlöw
2009-11-17 13:24 ` Nordlöw
2009-11-17 14:01 ` LanX
2009-11-17 14:09 ` LanX
2009-11-17 15:37 ` Ted Zlatanov
2009-11-18 11:16 ` Nordlöw [this message]
2009-11-18 22:19 ` Pascal J. Bourguignon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=83d9ac73-7e7f-4562-837a-f81b154ea232@m38g2000yqd.googlegroups.com \
--to=per.nordlow@gmail.com \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.