On 11 Jun 2011, at 21:25, Daniel Weinreb wrote:

I don't like (let (a b c) ...) any more than I do &aux.  I suppose
it's because I'm trying to think "functionally", with "let"
as much as possible being "compute this value
and give it a name" rather than "declare this
variable so I can start side-effecting it.

In general, I agree about (let (a b c) ...), but there are situations where it's hard to avoid.

I wish there were an idiomatic way to have a let
where the variable cannot be set later.  I do
have a macro for this in our library, but I
don't use it since it's not part of our general
programming style and consistency of
style is so important.

There is, actually:

(flet ((a () 5))
  ;; now (a) can only be read, but not assigned to
  ...)

I don't think this is as bad as it may seem at first sight, especially making this look like a variable again is easy:

(flet ((a () 5))
   (symbol-macrolet ((a (a)))
       ...))

I'm not saying there's no place for let followed
by side effects.  It's just not the way I usually
think of it.

Right.

Also, putting things in the parameter list that aren't
parameters just feels weird.

...but they are parameters, just not parameters passed by the client code explicitly. ;)

If I were designing Lisp again, I would also consider
not having &rest at all, and instead pass in "maps",
i.e. like alists, so that it would be easier to pass on
these arguments to other functions without
having to deal with "apply".

A lot of the original motivation of &rest was to
avoid consing.  In the original implementation,
the list values of &rest parameters were
stack-consed, and you were supposed to
be careful not to retain them beyond the
scope of the function, a trap for the unwary,
which could have very bad consequences.

The fact that &rest can avoid consing is a major win in performance-critical code. Any alternative design that doesn't support this in some way can lead to problems here.

I'm a bit less happy by now about the separation of required arguments and keyword arguments. Python makes the use of keywords optional for the same arguments, and I think that's actually better. I think this can in principle be implemented very efficiently.

And I would get rid of the supplied-p business,
which REALLY makes it hard to pass values
on to other functions.  Function composition
should not be hard to do.

Agreed.

But it's way to late to redesign Common Lisp.

No need to be pessimistic. We're still way ahead of everybody else. ;)

Pascal

--
Pascal Costanza
The views expressed in this email are my own, and not those of my employer.