422 lines
17 KiB
Plaintext
422 lines
17 KiB
Plaintext
|
From nobody Wed Oct 21 13:48:00 1998
|
||
|
Path: rice!mufasa.harvard.edu!rutgers!news.sgi.com!nntp.primenet.com!newsfeed.cwix.com!209.95.128.196!news-nyc.telia.net!masternews.telia.net!news-feed.inet.tele.dk!bofh.vszbr.cz!newsfeed.online.no!news.ccs.neu.edu!not-for-mail
|
||
|
From: William D Clinger <will@ccs.neu.edu>
|
||
|
Newsgroups: comp.lang.scheme
|
||
|
Subject: my notes from the Scheme workshop at ICFP98
|
||
|
Date: Mon, 19 Oct 1998 11:40:47 -0400
|
||
|
Organization: Northeastern University
|
||
|
Lines: 400
|
||
|
Message-ID: <362B5D7A.22872047@ccs.neu.edu>
|
||
|
References: <slrn72hak9.jts.mkgardne@perts6.cs.uiuc.edu>
|
||
|
Reply-To: will@ccs.neu.edu
|
||
|
NNTP-Posting-Host: bonneville.ccs.neu.edu
|
||
|
Mime-Version: 1.0
|
||
|
Content-Type: text/plain; charset=us-ascii
|
||
|
Content-Transfer-Encoding: 7bit
|
||
|
X-Mailer: Mozilla 4.04 (Macintosh; I; PPC)
|
||
|
To: mkgardne@cs.uiuc.edu
|
||
|
CC: will@ccs.neu.edu
|
||
|
Xref: rice comp.lang.scheme:24631
|
||
|
|
||
|
Will Clinger's revised notes (as of 19 Oct 1998) on the
|
||
|
Scheme Workshop before ICFP '98 in Baltimore,
|
||
|
26 September 1998, from one to six o'clock.
|
||
|
|
||
|
(Will's original notes included an incorrect description of
|
||
|
WITH-HANDLER. These revised notes incorporate Matthew Flatt's
|
||
|
code for WITH-HANDLER, and reflect Shriram Krishnamurthi's
|
||
|
confirmation that he volunteered to provide the web site for RFIs.
|
||
|
Will would like to emphasize that this was not a meeting of the
|
||
|
R*RS authors, and that his opinions as expressed in these notes
|
||
|
may not be shared by any of the other R*RS authors.)
|
||
|
|
||
|
|
||
|
Richard Kelsey presided, counted votes, but did not vote himself.
|
||
|
There were 25 attendees (including Kelsey) at the start of the
|
||
|
workshop, growing to at least 32 as the workshop continued. The
|
||
|
written proposals that were available before the workshop are
|
||
|
still available at
|
||
|
http://www.neci.nj.nec.com/homepages/kelsey/workshop.html.
|
||
|
|
||
|
|
||
|
Kelsey presented a list of the proposals that had been received,
|
||
|
and added a couple of new topics that were proposed for discussion
|
||
|
even though no formal proposals were in hand. For each proposal
|
||
|
and topic, he counted the number of attendees who wanted to cover
|
||
|
that proposal or topic at the workshop. The most popular topics
|
||
|
were then covered in decreasing order of popularity, except for
|
||
|
a few reorderings to consider related topics together or to delay
|
||
|
a topic that was expected to require an unusually long discussion.
|
||
|
The more complex topics were discussed toward the end of the
|
||
|
workshop.
|
||
|
|
||
|
[Except as noted within square brackets, the proposals that gained
|
||
|
the approval of a majority of those in attendance at the workshop
|
||
|
are extensions that do not conflict with the Scheme standards.]
|
||
|
|
||
|
|
||
|
RECORDS.
|
||
|
|
||
|
21 people wanted to discuss records. Kelsey reported that Kent
|
||
|
Dybvig and Bill Rozas had been developing a record proposal and
|
||
|
were almost finished. Their proposal was expected to be agreeable
|
||
|
to all. Kent summarized this proposal after the workshop ended
|
||
|
at six o'clock.
|
||
|
|
||
|
|
||
|
DELIMITED CHARACTER SYNTAX.
|
||
|
|
||
|
20 people wanted to discuss an oral proposal by Kent Dybvig that
|
||
|
a delimiter be required following the character syntax. For
|
||
|
example, (#\123) would be an error instead of being equivalent to
|
||
|
(#\1 23) as now. This change would make it possible to add some
|
||
|
extensions to the character syntax, for example to support Unicode.
|
||
|
Dybvig reported that Chez Scheme already requires a delimiter
|
||
|
following the character syntax, and would like to see that behavior
|
||
|
sanctioned by the Scheme standards.
|
||
|
|
||
|
Will Clinger requested that those present be polled to provide
|
||
|
some record of their opinions for posterity. Kelsey proposed that
|
||
|
the poll be worded as something like "How many people would like
|
||
|
to recommend this to the R*RS authors?" and "How many people would
|
||
|
prefer not to recommend this to the authors?". As the moderator,
|
||
|
Kelsey did not vote on this or any other proposal.
|
||
|
|
||
|
This straw poll indicated that 24 people wanted to recommend that
|
||
|
a delimiter be required following the character syntax, and none
|
||
|
were opposed to this recommendation.
|
||
|
|
||
|
[This requires minor changes to both the IEEE standard and the R5RS.]
|
||
|
|
||
|
|
||
|
LET-SYNTAX AND LETREC-SYNTAX SHOULD NOT CREATE A NEW SCOPE.
|
||
|
|
||
|
15 people wanted to discuss an oral proposal by Kent Dybvig that
|
||
|
LET-SYNTAX and LETREC-SYNTAX should not introduce a new scope.
|
||
|
This would allow a LET-SYNTAX or LETREC-SYNTAX form to expand
|
||
|
into one or more definitions that are visible in the scope in
|
||
|
which they appear. This is impossible with the R5RS semantics,
|
||
|
which effectively requires LET-SYNTAX and LETREC-SYNTAX to expand
|
||
|
into an expression of the form (LET () ___). The straw poll for
|
||
|
this issue was 17-3.
|
||
|
|
||
|
[This requires minor changes to the R5RS.]
|
||
|
|
||
|
|
||
|
REPOSITORY FOR PROPOSALS.
|
||
|
|
||
|
17 people wanted to discuss Alan Bawden's proposal for library
|
||
|
support primitives, which had more to do with process than with
|
||
|
technical changes to the language. Discussion led to a proposal
|
||
|
to create a World-Wide Web repository for proposals in the form
|
||
|
of requests for implementations (RFIs). Creating such a
|
||
|
repository does not require any changes to the R*RS or IEEE
|
||
|
standard, so the straw poll was amended to ask how many people
|
||
|
thought this should be done. The straw poll was unanimously in
|
||
|
favor.
|
||
|
|
||
|
Shriram Krishnamurthi volunteered to do this.
|
||
|
|
||
|
|
||
|
CHECKING FOR FEATURES SUPPORTED BY AN IMPLEMENTATION.
|
||
|
|
||
|
13 people wanted to discuss Marc Feeley's proposal for allowing
|
||
|
a program to query an implementation to determine its name or
|
||
|
version or other characteristics. This was considered early
|
||
|
because it was relevant to Bawden's proposal.
|
||
|
|
||
|
The attendees felt that it was more useful to inquire concerning
|
||
|
the properties of an implementation than to ask for the name or
|
||
|
version of the implementation, pointing to experience with the C
|
||
|
preprocessor. Feeley had proposed three different times for this
|
||
|
kind of query:
|
||
|
|
||
|
A. execution time
|
||
|
B. macro expansion time (as in C)
|
||
|
C. read time (during lexical analysis and parsing, as in
|
||
|
Common Lisp)
|
||
|
|
||
|
A separate straw poll was taken for each of these three times,
|
||
|
assuming a feature-oriented set of query predicates whose details
|
||
|
would have to be worked out in a future proposal. The results
|
||
|
of these straw polls were as follows:
|
||
|
|
||
|
A. execution time: 9-7
|
||
|
B. macro expansion time: 25-0
|
||
|
C. read time: 0-25
|
||
|
|
||
|
|
||
|
INCLUDING SOURCE CODE.
|
||
|
|
||
|
12 people wanted to discuss Marc Feeley's proposal for an INCLUDE
|
||
|
form that includes source code from a file. This was considered
|
||
|
early because conditional inclusion of a file is expected
|
||
|
to be one of the most common reasons for checking on the features
|
||
|
that are supported by an implementation.
|
||
|
|
||
|
Feeley's proposal was amended to allow (INCLUDE <filename>) to
|
||
|
appear anywhere an expression or definition can appear, and to
|
||
|
wrap an implicit (BEGIN ___) around the contents of the file.
|
||
|
|
||
|
The straw poll was 24-1 in favor of this proposal. Lars Hansen
|
||
|
voted twice, feeling that it was both a good and a bad idea
|
||
|
(bad because program-understanding tools become more sensitive
|
||
|
to the file system).
|
||
|
|
||
|
|
||
|
SAFER FILE I/O.
|
||
|
|
||
|
17 people wanted to discuss an off-the-cuff proposal by Will
|
||
|
Clinger to make opening and closing of files into safer operations.
|
||
|
As amended by the attendees, this proposal adds six new procedures:
|
||
|
|
||
|
(file-exists? <filename>)
|
||
|
(delete-file <filename>)
|
||
|
(rename-file <oldname> <newname>)
|
||
|
(with-input-from-port <port> <thunk>)
|
||
|
(with-output-to-port <port> <thunk>)
|
||
|
(call-with-file-error-handler <thunk> <proc> <arg1> ...)
|
||
|
|
||
|
Several implementations already provide the first three, and the
|
||
|
desirability of WITH-INPUT-FROM-PORT and WITH-OUTPUT-TO-PORT has
|
||
|
been noted by many people.
|
||
|
|
||
|
The second argument to CALL-WITH-FILE-ERROR-HANDLER is required
|
||
|
to be one of the following procedures:
|
||
|
|
||
|
open-input-file
|
||
|
open-output-file
|
||
|
delete-file
|
||
|
rename-file
|
||
|
|
||
|
This procedure is called on <arg1> ... . If a file i/o error
|
||
|
occurs, then the error is signalled by calling <thunk> with no
|
||
|
arguments and the same implicit continuation that was passed to
|
||
|
CALL-WITH-FILE-ERROR-HANDLER.
|
||
|
|
||
|
The straw poll was 20-4 in favor of this proposal.
|
||
|
|
||
|
Kelsey asked how many people wanted to discuss exceptions. Since
|
||
|
several people had arrived since the original vote was taken on
|
||
|
which topics should be discussed, and exceptions were perceived
|
||
|
to have the potential to consume the rest of the workshop, new
|
||
|
votes were taken to gauge the interest in several other topics
|
||
|
that had not yet been discussed.
|
||
|
|
||
|
|
||
|
IEEE FLOATING POINT.
|
||
|
|
||
|
24 people wanted to discuss Brad Lucier's proposal for bringing
|
||
|
Scheme's inexact arithmetic into line with the IEEE floating point
|
||
|
standards and with other recommended practice for transcendental
|
||
|
functions and complex arithmetic. Most of Lucier's proposals
|
||
|
would apply only to implementations that use IEEE floating point
|
||
|
for inexact arithmetic and would thus act as recommendations,
|
||
|
much like the appendices on inexact arithmetic that were published
|
||
|
with the IEEE standard for Scheme. A few of Lucier's proposals
|
||
|
would require changes to the Scheme standards themselves, however.
|
||
|
|
||
|
Discussion of Lucier's proposal required detailed knowledge of IEEE
|
||
|
floating point arithmetic, which most attendees did not have. The
|
||
|
straw poll was 31-0 in favor of bringing Scheme into line with IEEE
|
||
|
floating point and with current practice, trusting experts to work
|
||
|
out the details.
|
||
|
|
||
|
[This requires changes to both the IEEE standard and the R5RS:
|
||
|
|
||
|
The behavior of EQV? on inexact numbers would change.
|
||
|
If x and y are inexact reals represented as IEEE floating
|
||
|
point numbers, then (EQV? x y) would be true if and only if
|
||
|
x and y are equal _and_ have the same base, sign, number of
|
||
|
bits in the exponent, number of bits in the significand,
|
||
|
and the same biased exponents and significands. For
|
||
|
example, (EQV? +0. -0.) would be false, as would
|
||
|
(EQV? 1e8 1d8) in an implementation for which 1d8 has more
|
||
|
precision than 1e8. In most implementations (EQV? x y)
|
||
|
would be computed by a bit-level comparison of the floating
|
||
|
point representations for x and y.
|
||
|
|
||
|
(REAL? 4.3+0.i) and (REAL? 4.3-0.i) would be false, although
|
||
|
(REAL? 4.3+0i) and (REAL? 4.3-0i) would remain true (assuming
|
||
|
an implementation allows the real and imaginary parts of a
|
||
|
complex number to have a different exactness, which is not
|
||
|
required by the Scheme standards and would not be required
|
||
|
by Lucier's proposal).
|
||
|
|
||
|
TRUNCATE, ROUND, CEILING, and FLOOR would be defined only on
|
||
|
rationals, not on all reals. The motivation for this is that
|
||
|
infinities and NaNs would be reals but not rationals, and
|
||
|
there is no meaningful integer value that these procedures
|
||
|
could return for infinities and NaNs. Similarly the first
|
||
|
argument to RATIONALIZE would be required to be a rational.
|
||
|
|
||
|
The branch cuts for certain transcendental functions would
|
||
|
change to conform to current practice.
|
||
|
|
||
|
Kahan reportedly would like for (MAX 1 +nan. 2) to return 2
|
||
|
instead of +nan., but this would conflict with the guiding
|
||
|
principle of Scheme's inexact arithmetic so I oppose this.
|
||
|
Returning an inexact 2. would be consistent with Scheme's
|
||
|
arithmetic, and would not require any changes to the Scheme
|
||
|
standards.
|
||
|
|
||
|
The changes to EQV? and REAL? would probably be the most visible
|
||
|
in programs. Generally speaking, the people who want these
|
||
|
changes are also the only ones who are likely to notice them.]
|
||
|
|
||
|
|
||
|
EXCEPTIONS.
|
||
|
|
||
|
18 people wanted to discuss exceptions. Starting with the
|
||
|
Friedman/Haynes/Dybvig proposal, the attendees designed the
|
||
|
core of an exception system with three procedures and one
|
||
|
special syntactic form:
|
||
|
|
||
|
(current-exception-handler)
|
||
|
(call-with-handler <handler> <thunk>)
|
||
|
(raise <exception>)
|
||
|
(with-handlers ((<predicate> <handler>) ...) <body>)
|
||
|
|
||
|
These operations must be augmented by an abstract data type of
|
||
|
exceptions, including operations that:
|
||
|
|
||
|
create an exception
|
||
|
return an error message that is appropriate for an exception
|
||
|
extract other information that a programmer might want to
|
||
|
package with an exception
|
||
|
tell whether an exception is continuable
|
||
|
tell whether an exception is an i/o exception
|
||
|
...
|
||
|
|
||
|
Finally, an implementation would arrange for errors to be signalled
|
||
|
by calling the current exception handler with an appropriate
|
||
|
exception.
|
||
|
|
||
|
(CURRENT-EXCEPTION-HANDLER) returns the dynamically current
|
||
|
exception handler. Implementations would provide a default
|
||
|
handler, much like (CURRENT-INPUT-PORT) is the default input
|
||
|
port.
|
||
|
|
||
|
(CALL-WITH-HANDLER <handler> <thunk>) uses DYNAMIC-WIND or an
|
||
|
equivalent technique to make <handler> the dynamically current
|
||
|
exception handler, and calls <thunk>. The dynamic scope of the
|
||
|
<handler> ends when <thunk> returns.
|
||
|
|
||
|
(RAISE <exception>) calls the current exception handler with
|
||
|
one argument, the <exception>. RAISE could be defined by
|
||
|
|
||
|
(define (raise exception)
|
||
|
((current-exception-handler) exception))
|
||
|
|
||
|
but post-workshop deliberation has suggested that RAISE
|
||
|
should be used only for non-continuable errors, in which case it
|
||
|
would be defined by something like
|
||
|
|
||
|
(define raise
|
||
|
(letrec ((raise
|
||
|
(lambda (exception)
|
||
|
((current-exception-handler) exception)
|
||
|
(raise <continue-exception>))))
|
||
|
raise))
|
||
|
|
||
|
where <continue-exception> is an exception whose error message
|
||
|
would be something like "Contining a non-continuable exception
|
||
|
is not allowed.". Programmers who want to raise a continuable
|
||
|
exception could call (CURRENT-EXCEPTION-HANDLER) directly.
|
||
|
|
||
|
(WITH-HANDLERS ((<predicate> <handler>) ...) <body>) is syntactic
|
||
|
sugar for something like Matthew Flatt's untested
|
||
|
|
||
|
(define-syntax with-handlers
|
||
|
(syntax-rules ()
|
||
|
((_ ((predicate handler-procedure) ...) b1 b2 ...)
|
||
|
((call-with-current-continuation
|
||
|
(lambda (k)
|
||
|
(let ((rh (current-exception-handler))
|
||
|
(preds (list predicate ...))
|
||
|
(handlers (list handler-procedure ...)))
|
||
|
(call-with-handler
|
||
|
(lambda (exn)
|
||
|
(call-with-handler
|
||
|
rh
|
||
|
(lambda ()
|
||
|
(let f ((preds preds) (handlers handlers))
|
||
|
(if (not (null? preds))
|
||
|
(if ((car preds) exn)
|
||
|
(k (lambda () ((car handlers) exn)))
|
||
|
(f (cdr preds) (cdr handlers)))
|
||
|
(rh exn))))))
|
||
|
(lambda ()
|
||
|
(call-with-values
|
||
|
(lambda () b1 b2 ...)
|
||
|
(lambda args
|
||
|
(k (lambda () (apply values args))))))))))))))
|
||
|
|
||
|
The idea here is that <body> is evaluated within the dynamic scope
|
||
|
of an exception handler that takes an exception and tests it using
|
||
|
the predicates to select the specific handler that should handle
|
||
|
the exception. If no predicate returns true, then the handler
|
||
|
that was current when the WITH-HANDLERS form was entered is used.
|
||
|
The selected handler is called after the handler that was current
|
||
|
when the WITH-HANDLERS form was entered has been reestablished as
|
||
|
the current handler. This helps to avoid infinite loops when a
|
||
|
buggy exception handler generates an exception itself.
|
||
|
|
||
|
Most programmers are expected to use WITH-HANDLERS and RAISE as
|
||
|
a mechanism for exiting from a computation that encounters an error,
|
||
|
while the lower-level CALL-WITH-HANDLER and CURRENT-EXCEPTION-HANDLER
|
||
|
mechanisms allow for very fast continuable exceptions that do not
|
||
|
necessarily correspond to errors.
|
||
|
|
||
|
Kent Dybvig and Matthew Flatt were appointed to finish this proposal.
|
||
|
Marc Feeley and Will Clinger volunteered to review it.
|
||
|
|
||
|
The straw poll on this exception proposal was 31-1. Alan Bawden
|
||
|
voted negatively out of concern for problems that are not solved
|
||
|
by this proposal. The exception data type represents a kind of
|
||
|
language that programs use to communicate between the code that
|
||
|
encounters an unusual situation and the handler that deals with
|
||
|
the situation. The design of this language is the hard part.
|
||
|
We are hoping to finesse that by using a very simple abstract
|
||
|
data type of exceptions for now, leaving extensions of that data
|
||
|
type to the future.
|
||
|
|
||
|
|
||
|
UNICODE.
|
||
|
|
||
|
12 people wanted to discuss Marc Feeley's proposal for supporting
|
||
|
Unicode in Scheme. This proposal contained many parts, several
|
||
|
of which appeared to be separable. Some of the syntactic details
|
||
|
are fairly arbitrary and are justified by appeals to compatibility
|
||
|
with other languages; these details deserve more thought.
|
||
|
|
||
|
The attendees seemed to feel that some such proposal is needed but
|
||
|
that the details of Feeley's proposal were a little too unsettled.
|
||
|
|
||
|
The straw poll was 27-2 in favor of developing and adopting some
|
||
|
similar proposal, but was not a vote on the details of this
|
||
|
specific proposal. The negative votes apparently reflected a
|
||
|
feeling that it was not a good idea to vote on the general idea
|
||
|
of a proposal instead of its specific details.
|
||
|
|
||
|
[If Feeley's proposal is interpreted as a proposal for how an
|
||
|
implementation of Scheme should support Unicode, then the only
|
||
|
incompatibilities between Feeley's proposal and the existing
|
||
|
Scheme standards appear to be conflicts that could be resolved
|
||
|
by requiring a delimiter to follow the character notation, as
|
||
|
was discussed toward the beginning of the workshop.
|
||
|
|
||
|
If Feeley's proposal is interpreted as a proposal for requiring all
|
||
|
implementations of Scheme to support Unicode, however, then there
|
||
|
are a great many incompatibilities between Feeley's proposal and
|
||
|
the current Scheme standards.
|
||
|
|
||
|
It is not clear which of these interpretations was intended.
|
||
|
Feeley phrased his proposal in terms of a language called "System
|
||
|
Scheme", whose precise relationship to the Scheme standards is
|
||
|
unclear.]
|
||
|
|
||
|
|
||
|
The workshop ended at about six o'clock.
|
||
|
|