unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: Drew Adams <drew.adams@oracle.com>
To: Jean Louis <bugs@gnu.support>,
	"help-gnu-emacs@gnu.org" <help-gnu-emacs@gnu.org>
Subject: RE: [External] : Re: Testing whether a list contains at least one non-nil element
Date: Thu, 27 Oct 2022 03:54:37 +0000	[thread overview]
Message-ID: <CO6PR10MB54735656B90963E36FB72338F3339@CO6PR10MB5473.namprd10.prod.outlook.com> (raw)
In-Reply-To: <Y1mC3q9WltIgM4o5@protected.localdomain>

> (defun list-has-non-nil-p (list)
>   "Test if list has non nil element."
>   (elt (remq nil list) 0))

`remq' can end up needlessly traversing and
copying quite a lot of the argument LIST.

(defun remq (elt list)
  (while (and (eq elt (car list))
    (setq list (cdr list))))

  ;; Hey, we're done already.  Empty list
  ;; means no non-nil elements.  Nonempty
  ;; means the car is non-nil.
  ;;
  ;; Why do the rest of this?
  ;; Search for a nil, after the non-nil car?
  ;; Then copy the entire list.  Then delete
  ;; all nils from it?  Why on earth do this?
  (if (memq elt list)
       ^^^^
      (delq elt (copy-sequence list))
                 ^^^^^^^^^^^^^
       ^^^^^^^^^
    list))

First that removes all nils from the beginning
of LIST.  OK.  At that point either the list
is empty, and the answer is nil, or the first
list element is non-nil.  Just stop there.

Why go on, with the remainder of the list,
whose car is non-nil, searching for the next
nil?

Why then copy that entire remaining list and
then traverse it to delete all nils from it?

None of that makes sense.  Talk about "bloat"?
You're using the wrong function to do the job.

If you have a tiny list, or one where you
don't expect any non-nil elements before a
long way into the list, then maybe such wasted
effort isn't a concern.  Otherwise, it might
be.  And it's not needed.

Functions others (including I) sent for this
question don't have any of those problems.
They just traverse the list till they find a
non-nil value.  At worst, they traverse the
whole list once.

You certainly don't need to remove all nils
from the list.  If your list is 100,000,000
elements long and the first element is t, why
would you want to copy the entire list and
then remove all the nils from it?  Testing
the first element tells you the answer.

  reply	other threads:[~2022-10-27  3:54 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-25 10:16 Testing whether a list contains at least one non-nil element Heime
2022-10-25 10:46 ` Jean Louis
2022-10-25 10:47 ` Jean Louis
2022-10-25 10:50 ` Jean Louis
2022-10-25 12:12   ` Emanuel Berg
2022-10-26 18:56     ` Jean Louis
2022-10-27  3:54       ` Drew Adams [this message]
2022-10-27  4:53         ` [External] : " Jean Louis
2022-10-27  5:30           ` Emanuel Berg
2022-10-27 15:54           ` Drew Adams
2022-10-27 17:47             ` Elisp and CL (was: Re: [External] : Re: Testing whether a list contains at least one non-nil element) Emanuel Berg
2022-10-27 20:38             ` [External] : Re: Testing whether a list contains at least one non-nil element Jean Louis
2022-10-28  0:22               ` Emanuel Berg
2022-10-28  4:48               ` tomas
2022-10-28  5:19                 ` Jean Louis
2022-10-28  6:20                 ` Michael Heerdegen
2022-10-28 13:09                   ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-10-29  6:10                     ` Michael Heerdegen
2022-10-29 15:25                       ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-10-30 12:49                         ` Emanuel Berg
2022-10-29  6:38                     ` tomas
2022-10-30 12:48                     ` Emanuel Berg
2022-10-29  9:20                   ` Emanuel Berg
2022-10-29  9:19                 ` Emanuel Berg
2022-10-27  4:01       ` Emanuel Berg
2022-10-25 12:05 ` Michael Heerdegen
2022-10-25 12:15   ` Emanuel Berg
2022-10-25 15:59   ` [External] : " Drew Adams
2022-10-25 17:44     ` Emanuel Berg
2022-10-26 15:39       ` Drew Adams
2022-10-26 17:43         ` Emanuel Berg
2022-10-25 17:25 ` Joost Kremers
2022-10-25 17:51   ` Emanuel Berg
2022-10-25 19:44   ` Heime
2022-10-25 20:08     ` Joost Kremers
2022-10-25 20:15     ` [External] : " Drew Adams
2022-10-25 20:19       ` Joost Kremers
2022-10-26  3:00         ` Stefan Monnier via Users list for the GNU Emacs text editor
  -- strict thread matches above, loose matches on Subject: below --
2022-10-28  5:07 Drew Adams

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

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CO6PR10MB54735656B90963E36FB72338F3339@CO6PR10MB5473.namprd10.prod.outlook.com \
    --to=drew.adams@oracle.com \
    --cc=bugs@gnu.support \
    --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.
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).