automagic-integrations eta-substitution integrate-safely open-block-optimizations
((constant-procedure x) args ...) = x
(reference-barrier x)for wrangling weakness
scheme --batch-modeno longer messes with the tty modes.
(Note that we're skipping the 8.x version numbers because long ago there was an 8.x series that we never released.)
In the past my (CPH) policy for a stable release was that the documentation had to be updated for the release before it went out. In practice, this has meant that there have been no stable releases in recent years. As of this release, we will no longer consider updated documentation a prerequisite for a stable release.
#fare now distinct objects.
bchschemewas similar except that its temporary region was a file.
reduce; code using the old
reduceshould adapt to the new behavior, or use
reduce-leftwhich implements the old behavior.
record-type-default-initsnow returns a list, not a vector.
load-latestprocedures are now just aliases for
all.comband is now used by default, meaning that the compiler and Edwin are both loaded. In order to use the smaller
runtime.comband, it must be explicitly specified with the
--edwinoptions are now accepted but ignored. The env vars
MITSCHEME_ALL_BANDare now ignored.
--largeoption is now ignored, and all difference between large and small memory sizes is eliminated. The old
MITSCHEME_SMALL_fooenvironment variables are ignored, replaced by two new vars
MITSCHEME_STACK_SIZE. (There's no var for constant size since it's rarely necessary to specify it.)
(no-range-checks)allow these defaults to be overridden. This change will cause some performance degredation; we're interested in hearing about situations in which this is a significant problem.
MITSCHEME_LOAD_OPTIONSis now considered optional rather than required.
--loadcommand-line options have been changed so that their actions are queued to be evaluated by the REPL rather than being processed outside of the REPL context. This fixes various problems with the use of these options.
mit/gnuas features, to assist porting programs.
#;(+ 3 4).
discard-charis now an alias for
open-tcp-stream-socketnow takes only two arguments.
symbolprovides an easy way to build new (interned) symbols.
largest-fixnumprovide the limits on the fixnum representation.
channel-file-truncatecan truncate an open file.
string->symbolaccepts an ISO 8859-1 string and converts it, while
symbol->stringreturns an ISO 8859-1 string (or signals an error if conversion impossible). New procedures
symbol->utf8-stringprovide support for UTF-8 strings.
string->numbernow accepts an optional argument; if given and true, and the input string isn't a number's representation, an error is signalled.
readprocedure now accepts an optional second argument, an environment in which to look up control variables such as
*parser-radix*. This allows these variables to be scoped rather than dynamically bound, which in turn makes them much safer to use. Numerous callers of
readhave been changed to pass an appropriate environment here.
flo:with-rounding-modethat provide control over the floating-point rounding mode on systems that support it. Currently this is known to work on recent versions of GNU/Linux and OS X.
random-source-pseudo-randomize!from SRFI 27 has not been implemented. While I agree that this could be useful, it effectively mandates a particular PRNG, and I don't want to be forced to use it.
hashfrom SRFI 69 has not been implemented, as it's a name conflict with a pre-existing procedure.
*parsersupport for parsing character streams. This isn't yet documented.
xml-element-contenthas been renamed to
As of this release, MIT Scheme is a part of the GNU project and has been renamed MIT/GNU Scheme. The project is now hosted on Savannah. License text in the source files has been changed, and a license/warranty statement is now emitted during boot, to conform to the GNU coding standards.
This is the first testing release of MIT/GNU Scheme. I had originally planned to do a stable 7.8.0 release, but time pressures have made it difficult to bring the documentation up to date, so this release comes with out-of-date documentation. Additionally, there will be binaries only for GNU/Linux; users of other systems will have to wait for the stable release.
In releases 7.7.0 and 7.7.1, variable definitions (i.e. instances
define special form) appearing inside
let-syntax modified the environment outside of the
let-syntax, while syntax definitions (instances of the
define-syntax special form) modified the environment corresponding
let-syntax form. However, according to R5RS
this is incorrect: all definitions should modify the environment
corresponding to the
let-syntax form. The syntax has been
changed to conform to R5RS.
The record abstraction has received a major update. The primary purpose of this update has been to improve the performance of constructors, and to implement keyword constructors for records. As a consequence, the representation of record types has been changed. Because record types are constructed at load time, this has no effect on previously-compiled code.
define-structure macro was also changed to
use these new facilities. The interface between
define-structure and the record abstraction was changed
to increase performance, and consequently previously-compiled
define-structure no longer work and must be
A further change to
define-structure is that the
initial-value expressions are interpreted in a different way.
Previously, an undocumented feature of these expressions was that they
could refer to other supplied record field names as free variables.
This no longer works; instead these expressions are closed in the
environment in which the
define-structure macro appears.
The default type-descriptor name for
changed. Previously, for a structure defined as
(define-structure foo bar)
the type descriptor was named
foo. Now, the type descriptor
rtd:foo. This change is useful primarily because it
is common to name variables that hold objects of this type
foo, and when the type descriptor has the same name, it causes
confusion between references to the descriptor and unintended free
references to an object. (After making this change, several such free
references were found in the MIT/GNU Scheme code.)
define-structure now defines a type descriptor
for every structure definition, including structures without tags.
Previously this was done only for tagged structures.
The representation of character objects has been changed to provide direct support for Unicode. Previously, the representation had 16 bits of code and 5 bucky bits. The new representation has 21 bits of code and 4 bucky bits (the "top" bucky bit has been eliminated). This allows direct representation of the entire Unicode space.
In addition, the syntax of characters has been extended to allow arbitrary Unicode characters to be represented. The new syntax is #\U+XXXX, where XXXX is a sequence of hexadecimal digits specifying a Unicode code point. This supersedes an undocumented syntax #\<codeXXXX>.
The runtime library's support for Unicode has been completely rewritten, and now has support for UTF-8, UTF-16, and UTF-32 encodings, as well as support for wide strings. The UTF-8 codec has been fixed to signal errors for overlong coding sequences.
The special form
define-syntax has been changed so that the
right-hand side may be a keyword. This can be used to make aliases
for existing keywords, such as
(define-syntax sequence begin)
In pre-7.7 versions of MIT/GNU Scheme, the right-hand side of
the special form
define-syntax was a procedure, such as
(define-syntax foo (lambda ...))
This behavior was preserved in the 7.7 versions by a kludge that made the above equivalent to
(define-syntax foo (non-hygienic-macro-transformer (lambda ...)))
With this release, the old syntax has been eliminated. It is now
necessary to use the
form in these cases. (Note, however, that
non-hygienic-macro-transformer is also a kludge and is not
guaranteed to produce working macros. You should rewrite your macros
in hygienic form to guarantee proper operation.)
Command-line options now start with -- rather than -, again for compliance with GNU coding standards. The older - prefix still works but may eventually be dropped.
The external representation of symbols has been extended to support the quoting mechanisms of Common Lisp. This means that there is a standard external representation for every interned symbol. For example, the notations |abcDEF|, foo|BAR|baz, and abc\ def respectively represent the symbols whose names are "abcDEF", "fooBARbaz", and "abc def".
This change introduces an incompatibility in the way that symbols are printed. Previously, (write symbol) was equivalent to (write-string (symbol->string symbol)). Now, (write symbol) always writes the symbol out with appropriate quoting so that it will read back in as the same symbol.
A new command-line option --batch-mode disables output of banners, prompts, and values. This is intended for use with shell scripts, where the Scheme program writes to standard output and the author doesn't want the output cluttered by the interactivity cues. Note that the effect of this option applies only to the top-level REPL; if an error occurs, all the interactivity cues are re-enabled in the error REPL.
The following SRFIs are now supported: 0, 6, 8, 9, 23, and 30.
The following newly-implemented procedures are notable:
exact-positive-integer? host-big-endian? make-top-level-environment x-graphics/open-display? x-graphics/open-window?
tcp-server-connection-accept procedure now accepts an
line-translation, which sets the line
translation to be used for newly-accepted sockets. (Thanks to Arthur
Output ports now track the current column. This is simple minded but should work for ASCII, at least.
The URI support procedures, formerly a part of IMAIL, are now in the runtime library.
VC mode has a new editor variable
implements a small subset of the corresponding functionality in
debug-on-*-error editor variables can now be set to
'ask, which causes the user to be prompted for the debugger
when the corresponding error occurs. The default settings of these
variables have been changed to be more appropriate for typical users.
Support for XML namespaces has been implemented. One
consequence of this is that the representation of XML names
has been changed. It is no longer the case that XML names
can be compared with
eq?; instead one must use the new
xml-intern now takes an optional
second argument, which is the URI of the namespace. XML names that don't have an associated namespace URI are
now ordinary interned symbols, which greatly simplifies reference to
Comments are preserved by the parser.
The parser now distinguishes between <foo></foo> and <foo/> in its output. The former has a contents list of (""), while the latter has a contents list of ().
Optional indentation is supported for DTD and attributes during output.
The parser now supports handlers for processing instructions, which are invoked during parsing. A handler maps the text of a processing instruction to a list of XML items, which are inserted into the resulting XML structure in place of the processing instruction.
The following new procedures are available to make XML input and output more convenient:
read-xml read-xml-file write-xml-file string->xml substring->xml xml->string xml->wide-string
All the remaining bugs identified by the XML conformance tests have been fixed, except support for UTF-16.
Release 7.7.1 fixes several bugs in IMAIL; fixes a bug that prevented the use of server sockets on Windows systems; and fixes a bug that caused the debugger to generate errors in common circumstances.
This release provides
hygienic macro support, as
defined in R4RS and R5RS. This is a complete
rewrite of the syntax engine, so any program that uses macros should
be rewritten to use the new engine. A subset of the old
macro-definition syntax is still supported, but this will eventually
be removed. Note that the new syntax engine has no effect on the
compiled-code format; most binaries compiled by release 7.6.x should
continue to work.
These syntactic keywords have been eliminated:
define-macro in-package macro make-environment scode-quote sequence unassigned? using-syntax
The syntactic keyword
the-environment has been restricted to
use in top-level environments. It is no longer allowed in the body of
any binding form (e.g.
Syntactic keywords are now stored in environments, rather than in a separate syntax-table structure. The environment abstraction has been enhanced to support this, as well as to make it more general. The changes are documented in the reference manual.
The syntax-table abstraction has been eliminated, and most procedures
and arguments involving syntax tables have been removed. One
exception is the
load procedure, which still accepts a
syntax-table argument, but ignores it.
Although the 7.6.1 release had a workaround for problems with certain AMD Athlon processors, the workaround was ineffective on machines running Windows operating systems (and possibly OS/2 systems as well). This version fixes that problem.
The hash-table abstraction is now always loaded. It's not necessary
load-option prior to use of hash tables. For upwards
compatibility, calling (load-option 'hash-table) is still
permitted but does nothing.
The Free Software Foundation is the principal organizational sponsor of the GNU Operating System. Support GNU and the FSF by buying manuals and gear, joining the FSF as an associate member, or making a donation, either directly to the FSF or via Flattr.