unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
From: David Kastrup <dak@gnu.org>
To: guile-devel@gnu.org
Subject: Re: Why not support (begin), (cond), (case-lambda), etc?
Date: Fri, 06 Jan 2012 10:46:43 +0100	[thread overview]
Message-ID: <8762gpyxh8.fsf@fencepost.gnu.org> (raw)
In-Reply-To: 871urdd593.fsf@netris.org

Mark H Weaver <mhw@netris.org> writes:

> Hello all,
>
> I'd like to argue in favor of supporting (begin), (cond), (case-lambda)
> and other such degenerate forms, for the same reason that we support
> (*), (+), and (let () ...).

Actually, I'd like to see (let ()) and (lambda ()) work too for similar
reasons (basically equivalent to (if #f #f)).

> First of all: Is there any compelling reason not to support them?
> I can't think of one.  Can you?  If so, please do tell.

Detecting errors when writing macros.  Not all that likely, but that's
the standard argument against supporting degenerates.  And since the
whole point is restricting the number of valid cases, it is the main
argument.  The other is that there may be cases where one has to bend
over backwards to support degenerates.

Note that in other situations, degenerate cases are supported
astonishingly well:

guile> '( . 4)
4

> Imagine if we didn't support (*) and (+).  Then you couldn't simply
> write (apply + xs) to add a list of numbers; instead you'd have to write
> (if (null? xs) 0 (apply + xs)).

(apply + 0 xs) but it still is a distraction.

> In other words, they simplify higher-order programming by freeing the
> user from handling degenerate cases specially.

Unless they mean he has to handle them extra.  Or at least mean that the
user has to think about passing on degenerate cases cleanly.

> The same argument applies to (begin), (cond), and (case-lambda).  They
> simplify writing robust syntax transformers without having to handle
> degenerate cases specially.

Correct me if I am wrong (I actually have not really understood syntax
transformers), but the usual patterns of xxx ... can't be empty (that
is, the ... could be empty, but you still need something to match xxx in
order to have the ... identifiable).  That has always struck me as an
ugly limitation of the syntax: _I_ like being able to work with
degenerates.

> Apart from this general argument, I can think of one particularly
> compelling reason to support (begin).  Suppose you have a macro that
> generates a sequence of local definitions.  How do you return an empty
> sequence of definitions without terminating definition context?

(begin (values))

> The only way I can think of is to generate a dummy definition with a
> gensym name.  That's very ugly.

The above is not as ugly, but certainly more than ugly enough.

> Why force users into such complications needlessly?

I agree, but I am not in the situation to give a qualified assessment
about "needlessly": I don't know the implementation details.

-- 
David Kastrup




  parent reply	other threads:[~2012-01-06  9:46 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-06  0:49 Why not support (begin), (cond), (case-lambda), etc? Mark H Weaver
2012-01-06  3:37 ` Alex Shinn
2012-01-06  5:03   ` Mark H Weaver
2012-01-06  6:08     ` Alex Shinn
2012-01-06  8:03       ` Mark H Weaver
2012-01-06 12:08         ` Alex Shinn
2012-01-06 12:26           ` David Kastrup
2012-01-06 12:38             ` Alex Shinn
2012-01-06 12:50               ` David Kastrup
2012-01-06 12:52                 ` Alex Shinn
2012-01-06 13:02                   ` David Kastrup
2012-01-06 16:13                 ` Andy Wingo
2012-01-06 16:19                   ` David Kastrup
2012-01-06 17:23                     ` Andy Wingo
2012-01-06 17:11           ` Mark H Weaver
2012-05-01 14:10       ` Who moderates the scheme-reports list? Mark H Weaver
2012-05-05  5:09         ` Alex Shinn
2012-05-06  3:36           ` Mark H Weaver
2012-05-06  3:47             ` Alex Shinn
2012-05-06 10:12               ` David Kastrup
2012-05-07 16:26               ` Ludovic Courtès
2012-05-07 17:36                 ` Mark H Weaver
2012-05-07 22:06                 ` Alex Shinn
2012-05-08 14:42                   ` Ludovic Courtès
2012-01-06  9:48   ` Why not support (begin), (cond), (case-lambda), etc? David Kastrup
2012-01-06  9:46 ` David Kastrup [this message]
2012-01-06 16:48   ` Mark H Weaver
2012-01-06 17:02     ` David Kastrup
2012-01-06 16:53 ` Ian Price

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=8762gpyxh8.fsf@fencepost.gnu.org \
    --to=dak@gnu.org \
    --cc=guile-devel@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).