all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Basil L. Contovounesios" <contovob@tcd.ie>
To: "Mattias Engdegård" <mattiase@acm.org>
Cc: Andy Moreton <andrewjmoreton@gmail.com>, emacs-devel@gnu.org
Subject: Re: 7 logical-xor implementations in source tree
Date: Tue, 23 Jul 2019 11:44:25 +0100	[thread overview]
Message-ID: <8736ixni7q.fsf@tcd.ie> (raw)
In-Reply-To: <7AAB8009-DD68-4EA7-93CC-3B4A89FC8AFD@acm.org> ("Mattias Engdegård"'s message of "Tue, 23 Jul 2019 11:14:42 +0200")

Mattias Engdegård <mattiase@acm.org> writes:

> Some naïve suggestions:
>
> * Call it `xor', to go with `and' and `or'

+1

> * Make it n-adic, taking at least 1 argument (since the operation has no identity)

That depends on the preferred semantics, right?  What semantics are you
suggesting?  Judging from online discussions I've come across, there's
more than one way to skin this cat.

I'm not convinced an n-ary xor function would be that useful in Emacs,
but I'm not opposed to it at all.  I'm interested to see arguments for
and examples of it.

Most people seem to define n-ary xor as a parity check (i.e. its result
is non-nil if the number of non-nil arguments is odd).

How often does this specific need crop up in Emacs that can't already
be handled more generally by bool-vectors or custom code like
(cl-oddp (length (delq nil list)))?

OTOH, a definition like the following:

  (defsubst xor (cond1 cond2)
    (cond ((not cond1) cond2)
          ((not cond2) cond1)))

not only performs simple logical xor more efficiently, but also returns
whichever of the two arguments is non-nil (though I can't imagine when
this last detail would ever be useful).

> * Make it a function, so that it can be used with `apply' etc.

Definitely, using either defsubst or define-inline.

> * Give it a compiler macro, for efficient partial application

That's already done by define-inline, right?  Since I'm not familiar
with compiler macros, can you please explain how they afford efficient
partial application?

> There is probably already something like this in CL, like everything else.

I'm not a CL expert, but some quick online searching did not reveal
much.  I had previously taken inspiration from Racket's boolean
operators, though: https://docs.racket-lang.org/reference/booleans.html

Thanks,

-- 
Basil



  parent reply	other threads:[~2019-07-23 10:44 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-22 18:48 7 logical-xor implementations in source tree Oleh Krehel
2019-07-22 21:47 ` Basil L. Contovounesios
2019-07-24 22:17   ` Basil L. Contovounesios
2019-07-24 23:15     ` Stefan Monnier
2019-07-24 23:44       ` Basil L. Contovounesios
2019-07-25 12:07         ` Mattias Engdegård
2019-07-25 17:28           ` Paul Eggert
2019-07-25 17:46             ` Mattias Engdegård
2019-07-28  7:09           ` Philippe Schnoebelen
2019-07-28  8:04             ` Alan Mackenzie
2019-07-28 19:43               ` Marcin Borkowski
2019-07-30  9:36                 ` Alan Mackenzie
2019-07-30 10:57                   ` Philippe Schnoebelen
2019-07-30 11:28                     ` Andy Moreton
2019-07-30 12:34                       ` Stefan Monnier
2019-07-30 14:25                         ` Barry Fishman
2019-07-31  3:16                           ` Richard Stallman
2019-07-31 15:20                             ` Barry Fishman
2019-07-31 15:42                               ` Stefan Monnier
2019-07-31 20:22                                 ` Basil L. Contovounesios
2019-07-31 21:15                                   ` Michael Heerdegen
2019-07-31 22:28                                   ` Mattias Engdegård
2019-07-31 23:39                                     ` Basil L. Contovounesios
2019-08-02 10:29                                       ` Mattias Engdegård
2019-08-02 10:59                                         ` Basil L. Contovounesios
2019-08-06 11:58                                           ` Mattias Engdegård
2019-07-31 20:31                               ` Michael Heerdegen
2019-07-31 21:38                                 ` Drew Adams
2019-07-31 22:03                                   ` Drew Adams
2019-07-31 22:05                                   ` Basil L. Contovounesios
2019-07-31 23:20                                     ` Drew Adams
2019-08-01  0:09                                       ` Basil L. Contovounesios
2019-07-31 17:12                   ` Marcin Borkowski
2019-07-23  8:39 ` Andy Moreton
2019-07-23  9:08   ` Basil L. Contovounesios
2019-07-23  9:14   ` Mattias Engdegård
2019-07-23 10:26     ` Andy Moreton
2019-07-23 10:40       ` Andreas Schwab
2019-07-23 12:11         ` Andy Moreton
2019-07-23 13:20           ` Basil L. Contovounesios
2019-07-23 13:54             ` Andy Moreton
2019-07-24 22:21               ` Basil L. Contovounesios
2019-07-23 10:44     ` Basil L. Contovounesios [this message]
2019-07-23 11:01       ` Yuri Khan
2019-07-25 21:46       ` Juri Linkov
2019-07-23 11:24     ` Noam Postavsky
2019-07-23 12:38     ` Stefan Monnier
2019-07-23 16:41       ` Mattias Engdegård
2019-07-23 17:12         ` Eli Zaretskii
2019-07-23 17:48         ` Paul Eggert
2019-07-23 19:45           ` Stefan Monnier

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=8736ixni7q.fsf@tcd.ie \
    --to=contovob@tcd.ie \
    --cc=andrewjmoreton@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=mattiase@acm.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.