(Alan Manuel Gloria posted only to me, but it's clear it was intended for the 
whole list, so here it is reposted... with a few comments by me.)

Alan Manuel Gloria:
> > Neil Toronto:
> > > > One thing I don't understand is the need for full
> > > > backward compatibility. Is it because readers are global, and you can't
> > > > switch them out per-file - or at least, you can't expect people to do 
> > > > that?
> >
> > Alan Manuel Gloria:
> > > I think he wants to add this as part of the LISP language.  If
> > > swt-expr readers are somehow inherently incapable of reading s-expr --
> > > well, LISP's without support for s-expr syntaxes seem to have failed
> > > to really capture the attention of LISP users e.g. Dylan.  If he can
> > > somehow keep s-expr syntax while supporting m-expr syntax, he hopes to
> > > attract both oldtimers who are madly in love with s-exprs, and
> > > newcomers who can't figure out all those parens.
> > > As far as I can tell, swt-expr is an attempt to get m-expr syntax
> > > while retaining the possibility of reading s-expr syntax.
> >
On Nov 27, 2007 2:32 PM, David A. Wheeler <[EMAIL PROTECTED]> wrote:
> > *Bing*.  That's it, exactly.
> >
> > Hmm, we have a mind reader on the list.  Better keep all my thoughts 
> > G-rated :-).
> LOL don't worry, I scanned your mind, all your non-G-rated thoughts
> aren't even up to my level of non-G-rated thoughts!
> > > Finally - conventional wisdom claims that LISP's most important power,
> > > macros, is possible only because of the sheer number of parens in the
> > > s-expr syntax (I would contend this, though).  So, just in case macros
> > > really, really need s-expr - better keep it in, since we don't want to
> > > accidentally cut LISP's power.
> >
> > Macros are actually no big deal to support.  The problem is the vast amount 
> > of existing software which use s-expressions, as they currently exist.  New 
> > languages are really, really painful to start, while tweaks on existing 
> > ones are much easier to get going.  So if there are _reasonable_ 
> > compromises for backwards-combatibility (grin), I certainly want to 
> > entertain them.
> 
> defmacro operation-on-two-exprs (a o b)
>     `{,a ,o ,b}
> 
> expand-macro-1 '(operation-on-two-exprs a + b)
> => ?
> expand-macro-1 '(operation-on-two-exprs a bar b)
> => ?
> 
> From my understanding sweet-expressions it seems it does all
> translations before macros even work.  So I suppose that in a macro's
> `(,) some features just can't be used, as shown above.

Correct.  I don't see how to "fix" that. That drawback should be documented at 
least, because that IS unfortunate.  Basically, you CAN use infix operations in 
macro definitions - no problem.  You can use infix operations in parameters TO 
macros - no problem.  But if the function names THEMSELVES are parameters, 
there's no way to detect that they are infix operators at (read) time.... so 
the macro cannot use functions-as-parameters as infix operators.  There's 
really no easy way around this if you determine infixness at read time.

So, if you define a macro where the FUNCTION is a passed-in parameter, you MUST 
use prefix notation and not infix notation to call the function.  That's 
unfortunate, but since this only affects _defining_ macros, this isn't too bad. 
 After all, _existing_ Lisp systems already have this limitation :-).

A solution is to use macros to do this translation, which is of course what nfx 
and friends do.  But they don't handle the other things I'm trying to do.  I 
don't see a problem with having several different approaches for making 
Lisp-like languages easier to use... at least:
1. A simple macro that easily fits into Lisp-like systems
2. A replacement for (read) that does more, but thus requires more mechanisms.

...
> > Can-do. Note that ' and ` and , all work already.  However, that first "(" 
> > disables indentation as being meaningful until the closing ")".  You can 
> > use ' and other markers without "(" at all, that works too.
> First '(' including function-prefixed f(...), or just naked '(' (f
> ...)?  I'd assume the naked '(' only.

Yes, correct.

...

> > So if we aren't going to rewrite everything, there are file-level settings, 
> > and they have be stored INSIDE the "read". Except that stuff gets hairy 
> > here.  What exactly a "port" is (where you can get data from) isn't exactly 
> > spelled out in great detail, and it's DEFINITELY not common across Lisp 
> > implementations (even ones that implement the "same" spec).  E.G., what if 
> > you're reading from a string?  A file which has been opened multiple times? 
> >  You can do it, sortof, but it's exceedingly nasty... and thus somewhat 
> > unreliable.

> Not to mention the potential headaches of multithreading...  "so,
> which (read...) function state did you mean...?"

In the case of multiple threads doing I/O with the same source, the program 
better ALREADY have a method for deconflicting the threads, or the program is 
toast anyway :-).  But clearly, if there are multiple threads, a "read" that 
maintains per-port state has to protect that state from multiple threads.  So 
now we have a global data structure that's consulted on every read, which has 
to be protected from multiple-thread access.  Not impossible, but that's a lot 
of complexity that can be eliminated entirely by NOT supporting a 
per-stream-state interface.

--- David A. Wheeler

Reply via email to