unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: Drew Adams <drew.adams@oracle.com>
To: Emanuel Berg <embe8573@student.uu.se>, help-gnu-emacs@gnu.org
Subject: RE: member returns list (was: Re: To `boundp' or not to `boundp'?)
Date: Tue, 1 Sep 2015 23:21:15 -0700 (PDT)	[thread overview]
Message-ID: <2d84e377-3f73-48f0-b351-6ca5b94d6f47@default> (raw)
In-Reply-To: <87r3mhr55z.fsf@debian.uxu>

> It looks like this: (member ELT LIST)
> 
> When is it beneficial to, instead of just getting
> a `t' on a hit, to get a list that consists of ELT and
> everything eastward of ELT, in LIST?

When that is what you want/need. ;-)

> The `car' example I provided may look cool (?) but it
> isn't anything that cannot be done with "memberp",
> because obviously the car is known, otherwise one
> wouldn't be able to search for it.

Sure, if you just want the element you're testing for, then
(car (member 'foo xs)) is no better than
(and (memberp 'foo xs)  'foo)

(In the second example, if the element needs to be
computed, let-bind it to avoid computing it twice.)

But maybe you want the next element after `foo':
(cadr (member 'foo xs))

Or the element after `foo' or the first element if `foo' is
not in the list:
(or (cadr (member 'foo xs))  (car xs))

Or maybe you want to change `foo' to `bar' in the list:
(setcar (member 'foo xs) 'bar)

Or maybe you want to truncate the list after `foo':
(setcdr (member 'foo xs) ())

Or maybe you want to ensure that 'foo is at the head of
the list, adding it there if not already in the list:
(if (null xs)
    (setq xs  (list 'foo))
  (let ((tl  (member 'foo xs)))
    (unless (eq tl xs)
      (when tl (setcdr (nthcdr (1- (- (length xs) (length tl))) 
                               xs)
                       (cdr tl)))
      (setq xs  (cons 'foo xs))))
  xs)

Or the same thing for any list variable and element:
(defun put-at-head (list-var element)
  (let* ((lis  (symbol-value list-var))
         (tl   (member element lis)))
    (cond ((null lis) (set list-var (list element)))
          ((not (eq tl lis))
           (when tl (setcdr (nthcdr (1- (- (length lis) (length tl)))
                                    lis) 
                            (cdr tl)))
           (set list-var (cons element lis)))))
  (symbol-value list-var))

You get the idea.  Often, if you care about the list structure
it is because you are modifying it (destructive operations).
(Not always - e.g., (cadr (member 'foo xs)).)
 
And yes, most other uses of `member' (and `memq') are just tests
for membership.  You can see this by grepping the Emacs Lisp sources.



  reply	other threads:[~2015-09-02  6:21 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-01 15:50 To `boundp' or not to `boundp'? Alexander Shukaev
2015-09-01 15:51 ` Dmitry Gutov
2015-09-01 15:53   ` Alexander Shukaev
2015-09-01 16:42   ` Drew Adams
2015-09-01 17:13     ` Michael Heerdegen
2015-09-01 18:00       ` Drew Adams
     [not found]   ` <mailman.331.1441125765.19560.help-gnu-emacs@gnu.org>
2015-09-01 20:20     ` Barry Margolin
2015-09-01 23:37       ` member returns list (was: Re: To `boundp' or not to `boundp'?) Emanuel Berg
2015-09-02  0:10         ` Drew Adams
2015-09-02  0:27           ` Emanuel Berg
2015-09-02  0:38             ` Drew Adams
2015-09-02  1:17               ` Emanuel Berg
2015-09-02  6:21                 ` Drew Adams [this message]
2015-09-02 21:20                   ` Emanuel Berg
     [not found]               ` <mailman.370.1441156160.19560.help-gnu-emacs@gnu.org>
2015-09-03  5:17                 ` member returns list Pascal J. Bourguignon
2015-09-04  0:26                   ` Emanuel Berg
2015-09-02 16:45         ` Michael Heerdegen
2015-09-02 21:47           ` Emanuel Berg
2015-09-02 22:09             ` Michael Heerdegen
2015-09-02 22:11             ` Drew Adams
2015-09-02 22:13             ` Marcin Borkowski
2015-09-04  1:03               ` Emanuel Berg
2015-09-04  6:50                 ` Marcin Borkowski
2015-09-05 17:35                   ` Emanuel Berg
2015-09-05 17:55                     ` Random832
2015-09-05 18:09                       ` Emanuel Berg
2015-09-05 21:04                         ` Random832
2015-09-06  2:57                           ` Emanuel Berg
     [not found]                     ` <mailman.552.1441475739.19560.help-gnu-emacs@gnu.org>
2015-09-05 23:39                       ` Pascal J. Bourguignon
2015-09-06  2:46                         ` Emanuel Berg
2015-09-09  1:48                           ` Robert Thorpe
2015-09-09  2:44                             ` Pascal J. Bourguignon
2015-09-09  3:19                               ` John Mastro
2015-09-10  0:25                             ` Emanuel Berg
     [not found]                         ` <mailman.557.1441507097.19560.help-gnu-emacs@gnu.org>
2015-09-06 21:20                           ` Pascal J. Bourguignon
2015-09-06 23:33                             ` Emanuel Berg
     [not found]                             ` <mailman.598.1441581917.19560.help-gnu-emacs@gnu.org>
2015-09-06 23:47                               ` Pascal J. Bourguignon
2015-09-07  1:29                                 ` Pascal J. Bourguignon
2015-09-07  2:25                                   ` Emanuel Berg
2015-09-09  1:44                                   ` Robert Thorpe
2015-09-10  0:23                                     ` Emanuel Berg
     [not found]                                     ` <mailman.793.1441844665.19560.help-gnu-emacs@gnu.org>
2015-09-10  2:01                                       ` Pascal J. Bourguignon
2015-09-10  2:32                                         ` Emanuel Berg
     [not found]                                           ` <ECCA0E56-A051-4D38-8CBB-6CE9208BB047@openmailbox.org>
2015-09-11  1:32                                             ` Emanuel Berg
2015-09-11  1:46                                               ` Emanuel Berg
     [not found]                                         ` <mailman.797.1441852386.19560.help-gnu-emacs@gnu.org>
2015-09-10  4:21                                           ` Pascal J. Bourguignon
2015-09-10 18:09                                             ` Alex Kost
2015-09-11  1:01                                               ` Random832
2015-09-11  1:28                                                 ` Emanuel Berg
2015-09-11  2:01                                                   ` Emanuel Berg
2015-09-11  2:52                                                     ` Random832
     [not found]                                                   ` <mailman.890.1441936900.19560.help-gnu-emacs@gnu.org>
2015-09-11  2:27                                                     ` Pascal J. Bourguignon
2015-09-12  0:10                                                       ` Emanuel Berg
2015-09-11  2:37                                                   ` Ian Zimmerman
2015-09-11  1:03                                               ` Emanuel Berg
2015-09-11  0:57                                             ` Emanuel Berg
2015-09-11  5:42                                               ` tomas
2015-09-12  0:18                                                 ` Emanuel Berg
2015-09-13  8:12                                                   ` tomas
     [not found]                                               ` <mailman.897.1441950163.19560.help-gnu-emacs@gnu.org>
2015-09-11 23:29                                                 ` Pascal J. Bourguignon
2015-09-12  0:20                                                   ` Emanuel Berg
     [not found]                                                   ` <mailman.966.1442016910.19560.help-gnu-emacs@gnu.org>
2015-09-12  2:01                                                     ` Pascal J. Bourguignon
2015-09-12  3:26                                                       ` Emanuel Berg
2015-09-13  7:50                                                       ` tomas
2015-09-12  2:03                                                     ` Pascal J. Bourguignon
2015-09-12  2:45                                                       ` Stefan Monnier
2015-09-12  3:12                                                         ` Emanuel Berg
2015-09-12  3:31                                                       ` Emanuel Berg
     [not found]                                                       ` <mailman.972.1442025961.19560.help-gnu-emacs@gnu.org>
2015-09-12  6:16                                                         ` Pascal J. Bourguignon
2015-09-12 23:38                                                           ` Emanuel Berg
2015-09-13  8:03                                                             ` tomas
2015-09-14  1:31                                                               ` Emanuel Berg
     [not found]                                                           ` <mailman.1016.1442100597.19560.help-gnu-emacs@gnu.org>
2015-09-13  0:09                                                             ` Pascal J. Bourguignon
2015-09-13  0:24                                                               ` John Mastro
     [not found]                                                               ` <mailman.1019.1442103883.19560.help-gnu-emacs@gnu.org>
2015-09-13  4:29                                                                 ` Pascal J. Bourguignon
2015-09-16  0:01                                                               ` computer history (was: Re: member returns list) Emanuel Berg
     [not found]                                                       ` <mailman.978.1442028310.19560.help-gnu-emacs@gnu.org>
2015-09-12  6:18                                                         ` member returns list Pascal J. Bourguignon
2015-09-12 23:56                                                           ` Emanuel Berg
     [not found]                                                           ` <mailman.1018.1442101697.19560.help-gnu-emacs@gnu.org>
2015-09-13  0:20                                                             ` Pascal J. Bourguignon
2015-09-14  1:24                                                               ` Emanuel Berg
2015-09-12  2:04                                                     ` Pascal J. Bourguignon
2015-09-12  3:15                                                       ` Emanuel Berg
2015-09-12  7:40                                                   ` Eli Zaretskii
     [not found]                                             ` <mailman.884.1441933051.19560.help-gnu-emacs@gnu.org>
2015-09-11  2:26                                               ` Pascal J. Bourguignon
2015-09-12  0:16                                                 ` Emanuel Berg
2015-09-07  2:38                                 ` Drew Adams
2015-09-07  2:37                             ` Drew Adams
     [not found]                 ` <mailman.502.1441349470.19560.help-gnu-emacs@gnu.org>
2015-09-04 17:26                   ` Barry Margolin
2015-09-05 17:40                     ` Emanuel Berg
2015-09-02  0:40       ` member (was: Re: To `boundp' or not to `boundp'?) Emanuel Berg
     [not found]       ` <mailman.363.1441150201.19560.help-gnu-emacs@gnu.org>
2015-09-02 16:25         ` member returns list " Barry Margolin
2015-09-02 21:35           ` Emanuel Berg
     [not found]           ` <mailman.426.1441229773.19560.help-gnu-emacs@gnu.org>
2015-09-02 22:56             ` Barry Margolin
2015-09-02 23:23               ` Emanuel Berg
     [not found]       ` <mailman.368.1441153951.19560.help-gnu-emacs@gnu.org>
2015-09-03  5:19         ` member Pascal J. Bourguignon
2015-09-04  0:24           ` member Emanuel Berg
     [not found]     ` <<barmar-B5D67F.16201001092015@88-209-239-213.giganet.hu>
2015-09-01 20:42       ` To `boundp' or not to `boundp'? Drew Adams
2015-09-02  2:12 ` Stefan Monnier
2015-09-02 15:26   ` Alexander Shukaev
2015-09-02 16:51     ` Michael Heerdegen
     [not found]     ` <mailman.410.1441212753.19560.help-gnu-emacs@gnu.org>
2015-09-02 20:00       ` Barry Margolin

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=2d84e377-3f73-48f0-b351-6ca5b94d6f47@default \
    --to=drew.adams@oracle.com \
    --cc=embe8573@student.uu.se \
    --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).