unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
From: Mark H Weaver <mhw@netris.org>
To: Andy Wingo <wingo@pobox.com>
Cc: guile-devel <guile-devel@gnu.org>
Subject: Re: guile and elisp
Date: Sat, 27 Mar 2010 14:01:59 -0400	[thread overview]
Message-ID: <20100327180158.GC9481@fibril.netris.org> (raw)
In-Reply-To: <m3eij5u2m7.fsf@pobox.com>

(BTW, I'm deliberately writing "lisp" instead of "elisp" because these
discussions should be relevant to any lisp dialect that uses nil for
both false and eol, and in the future guile might support other lisps).

On Sat, Mar 27, 2010 at 05:54:24PM +0100, Andy Wingo wrote:
> I'm not sure (I keep saying "not sure", and I'm really not :) that
> *value* or *identity* is the way to solve this problem. To me the
> question is more of *property* -- is this value false, is it equal? to
> another, is it a boolean, etc.

Well, if we can assume that all non-lisp code in the guile system will
robustly handle nil by using the appropriate predicates, then yes,
that's a fine solution with clear semantics.  I just don't think
we can safely assume that.

Someday there may be significant libraries and other complex software
developed elsewhere being used in guile-emacs.  Most code outside of
the lisp world has never had to cope with an ambiguous "maybe boolean
false or maybe the empty list" value.  When that code meets the lisp
world, I guarantee you'll start seeing obscure bugs crop up.  The
system as a whole will not be as robust as it could be.

A lot of code outside of lisp uses equality to test boolean values.
If nil is distinct from #f, then that code will fail.

A lot of code assumes that if a value is boolean, then it cannot be a
list, and vice versa.

Some code looks up booleans and/or lists in hash tables or other
structures.  That code won't deal gracefully with list structures
containing nil.

Some object-oriented languages may overload an operation depending on
whether a parameter is a boolean or a list.  I don't see how such code
can deal with nil gracefully without being significantly rewritten.

Using your proposed intransitive equality predicates would handle many
of the common cases properly, but not all of them.

I see no way to handle these kinds of problems robustly without
gradually deprecating nil.  My proposal allows instances of nil to be
incrementally "annotated" by changing them to #f or '().

Lisp code treats all three values the same, so from lisp's point of
view these annotations are harmless and effectively no-ops.  But each
annotation has the potential to prevent some obscure nil-related bugs
from breaking non-lisp code which wasn't designed to handle nil.

These annotations could be done in response to the discovery of a
nil-related bug, or they could be done preemptively to reduce the
probability of such bugs before they occur.

They could be done either in the lisp sources, or elsewhere using my
proposed "canonicalize-*" procedures, perhaps where values are passed
from lisp to non-lisp code, or upon entry to code which is known not
to handle nil gracefully.

So, I guess I should have been more broad when I said that I want
"clear semantics".  More than that, I want to be able to robustly mix
lisp code with other code that was never designed to interface well
with lisp, with a minimum of obscure bugs cropping up.  The gradual
deprecation of nil (or at least the option of eventually doing so) is
the only path I see to toward that end.

   Regards,
     Mark




  reply	other threads:[~2010-03-27 18:01 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-25 12:22 guile and elisp Andy Wingo
2010-03-27 13:07 ` Mark H Weaver
2010-03-27 16:54   ` Andy Wingo
2010-03-27 18:01     ` Mark H Weaver [this message]
2010-03-28 12:13       ` Andy Wingo
2010-03-29  8:42 ` Ludovic Courtès
2010-03-29 10:43   ` Andy Wingo
2010-03-29 12:01     ` Ludovic Courtès
2010-03-29 18:32       ` Grant Rettke

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/guile/

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

  git send-email \
    --in-reply-to=20100327180158.GC9481@fibril.netris.org \
    --to=mhw@netris.org \
    --cc=guile-devel@gnu.org \
    --cc=wingo@pobox.com \
    /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).