Kaz Kylheku <kkylheku@gmail.com> wrote:
+---------------
| Johan Ur Riise <j...@riise-data.no> wrote:
| > Why is there not a backquote function or special form,
| > while threre is '... == (quote ...)
|
| Because when Common Lisp was standarized, existing implementations did
| not have such a thing, and each one implemented the read macro in its
| own way: a situation which persists today.
|
| Therefore, to introduce a BACKQUOTE operator would have meant
| inventing this language feature and forcing everyone to implement it.
|
| In the first round of standardizing a widely implemented existing
| language, you generally want to codify existing features that are
| common to the various implementations, rather than invent new things
| that nobody has. There are exceptions to this principle, but backquote
| didn't end up one of the exceptions.
+---------------
Unfortunate, IMHO, since IIUIC by the time ANSI CL was gelling
Scheme already *had* standardized a convenient S-expr expansion
for each backquote-related readmacro:
`form ==> (backquote form)
,form ==> (unquote form)
,@form ==> (unquote-splicing form)
Unlike CL, in Scheme BACKQUOTE is *not* implemented in the reader,
which merely expands the readmacros into the corresponding S-expr
expansions. BACKQUOTE is instead [pnormally] evaluated by EVAL,
and is of course a special form that must do a tree-walk of its
FORM argument and "do the right thing" when it encounters a sublist
whose CAR is UNQUOTE or UNQUOTE-SPLICING. There is considerable
experience in the Scheme community with this mapping, including
allowing UNQUOTE or UNQUOTE-SPLICING readmacros to be included
in *other* special forms than just BACKQUOTE. ["Scsh" a.k.a. "The
Scheme Shell" depends upon this, but CL *forbids* it, which is why
transliterating "Scsh" to "CLsh"[1] involves inserting lots of
backticks at inconvenient places.]
-Rob
[1] No, I know of no fully-working "CLsh", only a few gedankenexperiments
and/or.
-----
Rob Warnock <rpw3@rpw3.org>
627 26th Avenue <URL:http://rpw3.org/>
San Mateo, CA 94403 (650)572-2607