[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Grandfathering response
1. BEGIN vs. SEQUENCE: this is a pretty glaring ugliness in the report;
it's obvious to the world we couldn't get consensus on this one.
Many people have told me that they don't care which one is there, so
long as there's only one. SEQUENCE was used heavily in S&ICP and
for that reason I think it should be retained; thus the options I
offer are
(a) leave things as they are (BEGIN essential with non-essential
synonym SEQUENCE),
(b) remove BEGIN and make SEQUENCE essential (noting in the Notes
section that BEGIN, like #!TRUE etc., should be supported by
those implementations which care about running code written in
the past year).
Let me know your vote if you haven't done so already.
*****>> (a)
2. Similarly but less glaringly, we have a problem with the numeric
comparisons. Again, many people have said they don't care but they only
want one set, with or without question marks. Thus I offer
the choices
(a) leave things as they are
(b) flush the alternative names <? <=? >? >=? =?
[The ones without question marks were used in S&ICP; moreover, they
exist in other Lisp dialects. The argument in favor of the ?'s is that
it allows the simple statement: "names of predicates end in question mark".]
Send me your vote.
******>> (b)
3. REC and NAMED-LAMBDA :
Again, I sense capitulation on the part of some who have been stubborn.
The only options permitted are:
(a) Keep both
(b) Flush both
My editorial sense is that we should be able to achieve (b). Remember,
the language also doesn't have EVAL, environments, or macros, so if you
want to keep these features please say how they're different from other
"indispensible" features that the language DOESN'T have.
Named-lambda is totally unacceptable.
Letrec is often overkill and without macros we will be left
with using it. Rec is an incredibly powerful tool. I'd hate
to lose it from my repertoire. However, named-lambda is an
ugly so I am forced, given these choices, to opt for (b).
4. SUBSTRING-MOVE-LEFT! and SUBSTRING-MOVE-RIGHT! :
Many people have suggested removing these. Anyone who wants them
retained MUST provide a convincing rationale, for inclusion in the
report. Otherwise I'll remove them.
****>> Remove them
5. Should we say anything about the possibility of parallel or
interleaved argument evaluation? Remembering something I thought I
heard Will once say, I added the innocent little phrase "or perhaps
in parallel" to the description of procedure calling. Richard
Kelsey quickly pointed out that if it's mentioned as being a
possibly legal implementation, many otherwise valid scheme programs
may fail to run in implementations which do this, because they won't
do necessary synchronization. I agree; this is acceptable only if
we provide synchronization primitives.
****>> Yes, either provide synchonization primitives or flush the comment
8. Apparently there's no difference between ABS and MAGNITUDE. Should we
keep both? If so, should I change the presentation in any way?
*****>> don't keep both.
9. ANGLE is what Common Lisp calls PHASE; any interest in changing the
name? ...
*****>> I agree with the consensus.
10. Two-argument arctangent (ATAN Y X) is unnecessary, since its effect
can be trivially achieved by (ANGLE (MAKE-RECTANGULAR X Y)). Do we
apply Occam's razor and remove it? If it's retained, then I'll just
document it as being the same as (ANGLE (MAKE-RECTANGULAR X Y)).
*****>> follow Occam's razor here.
11. JINX says: if PROCEDURE? exists, then a portable printer can be written.
JAR replies (in jest):
(define procedure?
(lambda (obj)
(not (or (pair? obj) (null? obj) (symbol? obj) (number? obj) ...))))
Seriously however, I was the only holdout at Brandeis against having
this predicate. After thinking about this further I think it's not such
a bad idea, even though it is of limited use. Is anyone opposed to
having an essential procedure PROCEDURE?, to round out the set of type
predicates?
*****> include procedure?, but be sure that
(call/cc (lambda (k) (k (procedure? k)))) --> #t.
12. (if x 1) vs. (cond (x 1)) -- this is inconsistent, as a couple of people
have pointed out. I would expect these two expressions to have the
same meaning, but they don't. The first is defined to always return
an unspecified value. The second is defined to return the value 1
if x is true, and an unspecified value otherwise. I would like to
make this consistent, and there are two ways to do. Take your pick:
(a) Change IF expressions so that they return the value of the
second form if the first form evaluates to false.
(b) Change COND and CASE so that they return an unspecified value if
there is no ELSE clause.
Here are some arguments in favor of (a):
- It removes the possibility of inferring that an implementation might
not be tail-recursive through an alternate-less IF.
- Similarly, it makes (IF #T <exp>) mean the same as <exp>, and removes
doubt about the meaning of things like (if x (if y 1) z).
- It simplifies the macro expansion of COND as compared with (b).
- Option (b) is obviously undesirable (consider the case of mutually
exclusive test expressions in a COND).
****>> I favor including a "(when pred val) as the proper special form
for two branch-if's. That way two branch-if's would be syntactically
illegal. I've used them for about a year and I find less bugs creeping
into other's and my own programs.
13. Many people would like to see the (define ((((a b) c) d) e) ...)
feature go away. S&ICP doesn't use it, and it has a rather complicated
syntax (look at the BNF for evidence). Vote keep or flush.
*****>> flush it.
Presentation questions:
18. Several people have complained about Clinger's perhaps overly accurate
description of what happens when variables become bound. To be
accurate, we have to say that locations are created and the initial
value is stored in the location, but this doesn't sit well with the
desire to have Scheme sound like an almost-functional language.
What to do?
****> Realize that Scheme is not "almost"-functional, it's almost Algol!
I agree wholeheartedly agree with Will's characterization.
The best that can be said with respect to the functionality
of Scheme is that it contains a coherent subset that is "functional".
19. What should the dedication be? Sussman suggested the PDP-6, which was
the world's first Lisp machine, but some people didn't like this joke.
I have changed it to Christopher Strachey in the draft.
****> I prefer Christopher Strachey.
21. Should section numbers be zero-based? I'm beginning to think this looks
unprofessional; and it just doesn't look right in several places. It
worked well in the previous version of the report, and it's clearly more
consistent with the language (which is zero-based), but it doesn't work
the way I've reorganized things. If you like zero-based section
numbers, speak up.
*****> 1-based seems better.
22. Was Scheme the first programming language to have first-class lexical
closures? Can we say anything edifying along these lines?
*****> Landin's ISWIM was the first well-known one back in the early 60's.
However, I would guess that the use of "function" in the
"Lisp 1.5 Programmming Language Manual" should count as
a first-class closure. If all "lambda"'s were surrounded by
(function ...) then LISP 1.5 would model them. Furthermore,
call/cc can be written with Landin's J operat.
23. I flushed the historical note "CATCH could be provided by a procedure"
sentence (again, because two or three people thought it was random and I
agreed), but some of you have complained about this. Why should this
bit of history be present, but not others that are at least as
important?
*****> I won't argue for the history. However, the implementor who
thinks that catch (as in Common Lisp) and call/cc are the same
is in for a shock. That should perhaps be pointed out.
24. CALL/CC was mentioned in a sentence in a rationale in the RRRS. I
flushed the reference because (a) a number of people find the name
CALL/CC quite distasteful and (b) it is inconsistent to mention here
that some scheme implementations provide an alternate name for this but
not also do so for LABELS, BLOCK, and a zillion other things.
****> Carolyn Talcott in her dissertation suggested the term "note".
I could live with that. If call-with-current-continuation is
the only term, this will make those of us who write about this object
uncomfortable. I think we agreed that "call/cc" would be an
acceptable abbreviation and I would prefer to keep that name
in the report. Those who don't like the name can choose not to use it.
In a sense I agree with your argument, but "call-with-current
-continuation has 30 characters in it!, "labels" and "letrec", and
"block" and "begin" each have the same number of characters.
25. How best to resolve the inconsistencies between terminology in text and
semantics? Namely: "I", "Ide", "identifier" in semantics vs. "variable"
in text; "Com", "command" in semantics vs. "statement" in text.
****> "variable" is a "dangerous" word, try to expunge it. Opinions differ
as to what a variable is.
26. FORCE & DELAY are still problematic. About half of respondents said it
was better to put FORCE up front with DELAY, and the other half thought
it was fine as it was. No one gave convincing arguments.
****> I favor join them. I don't much care where they are joined.
28. In section 0.0, 2nd paragraph, before the terms "variable" and
"identifier" have been defined, it should say "variable" instead of
"identifier" to be consistent with the rest of the report. Is that OK?
****> See comment on 26.
29. There are two nonterminals in the BNF that need names. Currently they
are called <formals> and <formalz> which was never intended to be a
serious suggestion (I put it there to see if anyone would actually read
the BNF!). Actually one or both of these can go away if NAMED-LAMBDA
and/or (DEFINE ((( ...) ...) ...) ...) go away. Can someone who likes
these things take a look at the BNF and suggest names for these?
****> I hope they go away.
Language:
Removed non-essential features from examples (including the big one)
where possible: (1+ x) --> (+ x 1), (-1+ x) --> (- x 1), (define (foo
...) ...) --> (define foo (lambda ...)), 1-armed if --> cond, named let
--> letrec.
****> I'd still prefer "add1" or "succ" and "sub1" or "pred" to the
abuse of punnery "-1+", and its slightly weaker sibling "1+".
The cuteness of "-1+" should go. In writing for a mass audience
I have learned that there is a time and a place for clever un-pronouceable
function names. Please remove them and find pronounceable words