This message announces the availability of Scheme release scm5d0.

New in scm5d0:

The file "scm.info" is now included in the SCM distribution.
Moreover, changes from scm5c4.info are marked with `change bars' in
the right margin.  Similarly, text changes in the online manual
(http://swissnet.ai.mit.edu/~jaffer/scm_toc.html) versus scm5c4 are
highlighted in red.  These change markups were performed by SCM
programs; see http://swissnet.ai.mit.edu/~jaffer/infobar/index.html
for information and download.

Several problems with SCM `shell scripts' were fixed.  INFOBAR and
HITCH mentioned above exemplify the improvements.

SCM is now much easier to `embed' as a library.  The read-eval-print
loop and main() have been reorganized and simplified.

Radey.Shouman@splashtech.com greatly improved error reporting; console
messages no longer scroll off the screen.  Many small bugs were fixed.

	* ramap.c (init_ramap): definition for ARRAY-INDEXES added.
	* scmmain.c (generic_name): Added (local char** init wasn't
	portable).
	* Makefile (version.txi): support added.
	* scm.texi (SCM_VERSION): abstracted to version.txi.
	* build (make-readme): moved (require 'posix) here.
	* build.scm (read-version): simplified.
	* build (make-readme): added.  Makes README from scm5c4.info.
	* Makefile (README): added target.
	* build (print-manifest): added.
	* scm.texi: Added spacing workaround for Texinfo @deftypefun bugs.
	(Problems *): @table --> @multitable.
	(Standards Compliance): Updated for R5RS.
	(SCM Options): fixed - and --; @minus{} breaks TeX!
	* scm.texi (Scripting): renamed from Shell Scripts.  Reorganized;
	rewrote examples.
	(SCM Options): fixed -- as well as texinfo can.
	* Init5c4.scm (boot-tail): load *script* if not done by options.
	* script.c (script_process_argv): Allow space between #! and
	pathname.
	* scm.c (scm_init_from_argv): gets additional argument
	`script_arg', which becomes the value of *script*.
	* ioext.c (director-for-each): fail gracefully if can't open
	directory.
	* scm.texi (Smob Cells): Explained NUMDIGS_MAX limit.
	* sys.c (init_storage): Added check for NUMDIGS_MAX.
	* scmfig.h (NUMDIGS_MAX): moved from "scm.h".  Reduced to 1000
	(4816 decimal digits).
	* scm.texi (Embedding SCM): Added libtest.c example.
	* Makefile (libtest): Added target.
	* scm.c (dirsep): added variable.
	* repl.c (heap_report): Only call scm_brk_report() if scm_init_brk
	has been set.
	* scm.texi (Unix Shell Scripts): merged in "SCSH scripts".
	Removed description of single non-\ argument on first script line.
	* scm.texi (Embedding SCM): Rewrote.
	* repl.c (scm_top_level): Pass initpath string to boot-tail
	(rather than #t) for dumped executables.
	* scmfig.h (RTL): removed.  main() is now in scmmain.c.
	* build.scm (C-libraries): Added `lib', which excludes
	"scmmain.c"; Removed RTL flag.
	* dynl.c (init_dynl): Don't try to compute execpath.
	* script.c (find_impl_file): Renamed from scm_find_impl_file.
	Fixed reduntant "lib" check.  Added tests for executable-name peer
	and generic peer directories.
	* Init5c4.scm (set-vicinities!): Simplified.  Now takes init-file
	argument.
	* scmmain.c: created, stealing main() and scm_find_implpath() from
	"scm.c".
	* scm.c (scm_find_impl RTL main): removed.
	* repl.c, scm.c: moved initpath==0 argument handling from main to
	scm_top_level().
	* Makefile: Redundant DFLAG = -DIMPLINIT=\"$(IMPLINIT)\" removed.
	IMPLINIT still #defined by scmflags.h.
	* Link.scm (compile-file): Converted from replace-suffix to
	filename:substitute??.
	* build.scm (c->): Added.
	(c->o): Added.
	(c->obj): Added.
	(obj->exe): Converted from replace-suffix to filename:substitute??.
	* eval.c (ecache_eval_args): Added, allocates an environment frame
	in the ecache and does argument number checking for closures with
	>= 3 arguments (and no rest argument).
	(asubr_apply): Added to apply multiargument rpsubrs and asubrs without
	consing.
	* sys.c (scm_env_v2lst): Added for ecache_eval_args, builds a list
	of ecache cells from an argument vector.
	* eval.c (m_lambda): (closure): Now checks that argc <= 3 during
	memoization instead of each time a closure is made.
	(macroexp1): Gives more sensible error messages when a
	non-identifier non-list is in the function position.
	* (scm_top_level): (repl): Made repl an acceptable second argument to
	scm_top_level.
	* sys.c (VERIFY_INTS): Pass 0L rather than 0 for null pointer args.
	* scm.c: Pass 0L rather than 0 for null pointer args.
	* rgx.c (lregerror): Pass 0L rather than 0 for null pointer args.
	* repl.c (scm_top_level): Now takes a second argument, toplvl_fun,
	which is a function of no arguments returning SCM.  If this
	variable is non-null, it will be called instead of repl(), if
	toplvl_fun returns BOOL_T, it may be called again, otherwise
	scm_top_level will return.
	Now checks that BOOT-TAIL is non-immediate before applying it, so
	that it becomes optional.
	* scm.c (run_scm): Deleted, subsumed by main().
	* patchlvl.h (INIT_FILE_NAME): #defined even for RTL case.  The
	init file is probably useful even if the default top level is not
	used.
	* eval.c (varcheck): Now counts required arguments so m_lambda
	doesn't have to.
	* Macro.scm (Macro:compile-syntax-rules) Check that car of each
	rule is a pair.
	* scm.c (main): Changed argc==0 argv[0] from "scm" to
	GENERIC_NAME.
	* scm.texi (Embedding SCM): Changed from "Calling Scheme From C".
	* scm.c (scm_execpath scm_find_executable): moved from repl.c.
	(init_banner): Changed to use pre-processor concatenation.
	(main): modularized.
	(run_scm): freeall argument added to control calling of
	free_storage().
	* repl.c (scm_top_level): initpath with leading '(', ';', or
	whitespace taken as string to load (rather than filename).
	(init_sbrk): extracted from main().
	* dynl.c (init_dynl): ifdef RTL removed.
	* subr.c
	* scl.c (scm_intexpt): Special cases for arithmetic that can be
	done with native C types.  Moved from subr.c to scl.c because of
	FLOAT dependencies.
	* eval.c (lookupcar): (ceval_1): Added MEMOIZE_LOCALS cpp macro to
	control memoization of local variables to ilocs.
	* repl.c (tryload): Removed TAIL_RECURSIVE_LOAD version.
	(scm_top_level): If string argument starts with whitespace, `)', or
	`;', then call scm_ldstr() with argument rather than scm_ldfile().
	* build.scm (compile-dll-c-files linux): delete .o after making .so.
	* scm.c (init_scm): Rest of inits moved into.
	(final_scm): Handles finals.
	(scm_init_from_argv): Handles universal argv processing;
	platform-dependent argv processing remains in main().
	* repl.c (def_err_response): Fixed to print stack trace even if
	err_exp is not defined.
	* repl.c
	* sys.c
	* scm.h errjmp_bad is now a pointer to a string, rather than an
	int, so that the final error message can say in which critical
	code section the error occured.
	* repl.c (scm_top_level): renamed from repl_driver.
	* scl.c (makdbl): Combined some DEFER_INTS and ALLOW_INTS,
	possible because NEWCELL is now callable with ints deferred.
	(product): (divide): Now scale bignums if necessary before
	converting them to doubles for calculating inexact results.
	(big2scaldbl): (bigdblop): (inex_divbigbig): Auxiliary functions
	added.
	(idbl2str): Decrease minimum exponent to allow printing of
	gradually underflowing IEEE doubles.
	* scm.c (setitimer): Made each option individually controlled by #ifdef,
	now returns #f instead of error if given an unsupported option.
	* Init5c4.scm This is used to initialize the appropriate alarm
	procedures.
	* scm.h (NUMDIGS): Added cast so that NALLOC error reports would
	print correctly.
	* setjump.h: windframe removed -- dowinds could only be processed
	while (possibly oversize) stack was intact.
	* scm.h (ARGn .. PROF_SIGNAL): Special err_pos values renumbered
	from 1; this allows 0 to indicate message has been printed.
	(dynwinds): restored to sys_protects.
	* repl.c (repl_driver): dowinds() call moved from abrt(), quit(),
	and restart(); dowinds() now done after longjump.
	(repl_driver): cur_inp being closed now indicates that SCM should
	exit -- after printing error messages.
	(def_err_response): err_pos = 0 after printing message.  If
	err_pos==0, don't print message.
	* Init5c4.scm (fluid-let): Shrunk using multi_set returns.
	* eval.c (scm_multi_set): Now returns new list of old values.
	* scm.c (l_pause): DJGPP2.0 lacks ITIMER_VIRTUAL; can't quit SCM!
	#undef SIGPROF if ITIMER_VIRTUAL not defined.
	* sys.c (reset_safeport): fixed 16-bit argument to
	must_malloc_cell.
	(dowinds): fixed limit case behavior.
	* Init5c4.scm (fluid-let): defmacro added.
	* eval.c (scm_multi_set): Added.  (set! (a b c) (list 10 20 30))
	sets 3 variables.
	* sys.c (dowinds): Eliminated second argument.
	(dynwinds): No longer a sysprotect.
	* setjump.h (windframe): Dynamic wind information now kept in
	linked struct windframe on C-stack.
	* sys.c safeport now includes jmp_buf, to which it will longjump
	after writing its character limit.  This makes it safe to print
	out possibly circular structures in error handling routines.
	(reset_safeport): Now returns non-zero only if its argument
	really was a safeport.
	* setjump.h (SAFEP_JMPBUF): Macro accessor for the jmp_buf,
	setjump *must* be called with this argument before using a
	safeport.
	* repl.c (scm_stack_trace): (def_err_response): Use new
	safeport features.
	* Macro.scm (substitute-in-template): Added check that all pattern
	variables combined in an ellipsis template have the same length.
	* scm.texi (Socket): examples updated to use wait-for-input; no
	longer spin-wait.
	* repl.c (wait_for_input): `select'-like procedure added.
	(char_readyp): now supported by DJGPP.
	* ioext.c (l_putenv lexec*): DJGPP now supports.
	* scm.c (l_raise SIGALRM): DJGPP now supports.
	* scmfig.h: include <float.h> now seems safe for DJGPP.
	* scm.texi (Data Type Representations): PTOBs had wrong code and
	lsubr was missing!
	* repl.c (def_err_response): Now truncates ALL long expressions
	being printed.
	* sys.c (must_malloc must_malloc_cell): 0 -> 0L to fix 16-bit
	scmlit.
	* eval.c (ceval): (env2tree): (ident_eqp): Removed redundant
	DEFER_INTS_EGC before ENV_PUSH.
	(ceval_1): Removed label retunspec, replaced by jumps to
	retx.  Seems to run a tad faster, be a little easier to look at.
	(copy_list): Now takes second argument giving minimum length of
	list, allowing the removal of several calls to ilength.
	(m_case): (m_cond): (ceval_1): ilength checks replaced.
	* repl.c (scm_stack_trace): Changed numbering of stack frames.
	(def_err_response): Now prints erring expression before
	stack trace.
	(init_tables): Removed unnecessary assignment to
	scm_verbose, which was already 1 under any circumstances.
	(def_err_response): Now truncates long expressions being
	printed.
	(err_head): More robust test for output to stderr, to
	decide whether to call perror or not.
	* sys.c (init_types): Initialize sys_safep to tmp_errp.
	(reset_safeport): Now does exactly nothing if handed a
	non-safe-port.
	(init_types): (init_storage): Moved initialization of tmp_errp and
	sys_protects earlier, in case allocating ptobs or smobs causes
	errors to be thrown.
	* scm.h (NUM_IFLAGS): Added to make COOKIE, UNCOOK definitions a
	little easier to read.
	* sys.c (reset_safeport): Added, resets count and optionally
	parent port on a safe-port.
	(sys_safep): New sys_protect, so stack-trace doesn't have to
	allocate pairs for a safe-port.
	* repl.c (scm_stack_trace): Now uses sys_safep and reset_safeport.
	(def_err_response): (handle_it): (repl_driver): (everr):
	Now checks and dies horribly but predictably if def_err_response
	is recursively entered.
	* eval.c (env2tree): Check for undefineds in environment to
	prevent endless loop, substitute #<unspecified>.
	* repl.c (stack_trace): Now uses safe ports, prints "STACK TRACE"
	message (I don't remember when that disappeared) and prints at
	most 12 traced frames.
	* sys.c (makesafeport): (safewrite): (safeputs): (safeputc):
	(safeflush): Added support for `safe' ports for error messages,
	which will accept and re-output only a fixed number of
	characters. Subsequent characters are simply discarded.
	* record.c (rec_error): (rec_accessor1): (rec_modifier1):
	(rec_constr1): Better error reporting, including the name of the
	expected record type and the relevant field.
	(rec_prinset): Added PRINTER field to RTDs so they may be printed
	by a user- specified procedure.  Scheme signature:
	(RECORD-PRINTER-SET! RTD PRINT-PROCEDURE) where PRINT-PROCEDURE
	takes as arguments the record and a port.
	Added local accessor macros for record & rtd fields, removed
	questionable union type declarations.
	* Macro.scm (macro:compile-syntax-rules): Minor cleanup, made
	internal rule representation a record type rather than list.
	(renaming-transformer): Added to support `explicit
	renaming' low-level macros.
	* eval.c (varcheck): (m_lambda): Some checks moved from m_lambda
	to varcheck, argument added to varcheck to give different message
	(about "formals") in case of lambda.
	(ENVP): Added predicate macro local to eval.c.
	* eval.c (varcheck): Renamed from uniqcheck, now checks that
	elements are identifiers so m_do, m_lambda, m_letrec1 don't have to.
	* Init5c4.scm (alarm-interrupt) (profile-alarm-interrupt)
	(virtual-alarm-interrupt) Now initially defined to turn off their
	respective alarms, so that restarting does not cause an error when
	an alarm is pending.
	* sys.c (gc_mark): Now marks the header of smobs and ptobs, so the
	mark function doesn't have to.
	* unif.c:
	* record.c:
	* rgx.c:
	* rope.c:
	* scm.h: Ptob and smob mark functions modified to not mark headers.
	* eval.c (bodycheck): Removed, was only used in m_do.
	(m_do): No longer calls bodycheck.
	(lookupcar): No longer memoizes if no checking is to be done, eg
	if doing speculative expansion.
	(macroexp1): Now saves car in local variable to avoid calling
	unmemocar.
	(uniqcheck): Added, checks for non-unique identifiers in a binding
	list.
	(m_lambda): (m_letrec1): (m_do): Now check for duplicate bound
	names.
	* unif.c (shap2ra): better error checking of dimension specs
	* scmfig.h (SCM_NEED_FDS SCM_INTERRUPTED): added argument to make
	clear that this is not a constant.
	* scmfig.h (SCM_INTERRUPTED): Abstracted the interrupted test from
	SYSCALL.
	(SCM_OPENCALL): Similar to SYSCALL, but will gc to reclaim
	file descriptors.
	* sys.c	(try_open_file): Now uses SCM_OPENCALL.
	(gc_for_open_files): Added.
	* ioext.c:
	* posix.c:
	* socket.c: File opening system calls now use SCM_OPENCALL.
	If an open fails because there are no unused file handles, GC for
	for file handles.
	* Init5c4.scm (vicinity:suffix?): Abstracted from
	pathname->vicinity and "Link.scm".
	* sys.c, scm.c, record.c, ramap.c: Changed some intern -> sysintern.
	* build.scm (compile-c-files linux): gcc -O2 produces unreliable
	objects for Cyrix 6x86 processor; -O2 option removed.
	* ioext.c (init_ioext): (provide 'directory-for-each) changed to
	add_feature("directory-for-each"); so ioext.o can be statically
	linked.
	* scm.h (ESTK_PARENT): (ESTK_PARENT_WRITABLEP):
	(ESTK_PARENT_INDEX): SCM_ prepended, definition moved to scm.h,
	now used in repl.c.
	* repl.c (handle_it): Fixed so stack traces extend before
	interrupt handler calls.
	(scm_stack_trace): Fixed for segmented environment stack.
	* repl.c (def_err_response): print out errobj if short string; if
	long string, print out first 57 characters and "...".  This makes
	messages about not finding Init???.scm more informative.

				-=-=-

Scm conforms to Revised^5 Report on the Algorithmic Language Scheme
and the IEEE P1178 specification.  Scm is written in C and runs under
Amiga, Atari-ST, MacOS, MS-DOS, OS/2, NOS/VE, Unicos, VMS, Unix and
similar systems.  ASCII and EBCDIC are supported.

Documentation is included explaining the many Scheme Language
extensions in scm, the internal representations, and how to extend or
include SCM in other programs.  Documentation is online at:

	     http://swissnet.ai.mit.edu/~jaffer/SCM.html

SCM can be obtained via FTP (detailed instructions follow) from:
 swissnet.ai.mit.edu:pub/scm/scm5d0.tar.gz
 ftp.gnu.org:pub/gnu/jacal/scm5d0.tar.gz
 ftp.cs.indiana.edu:/pub/scheme-repository/imp/scm5d0.tar.gz

SLIB is a portable Scheme library which SCM uses:
 swissnet.ai.mit.edu:pub/scm/slib2c5.tar.gz
 ftp.gnu.org:pub/gnu/jacal/slib2c5.tar.gz
 ftp.cs.indiana.edu:/pub/scheme-repository/code/lib/slib2c5.tar.gz

JACAL is a symbolic math system written in Scheme:
 swissnet.ai.mit.edu:pub/scm/jacal1a9.tar.gz
 ftp.gnu.org:pub/gnu/jacal/jacal1a9.tar.gz
 ftp.cs.indiana.edu:/pub/scheme-repository/code/num/jacal1a9.tar.gz

HOBBIT is a compiler for SCM code:
 swissnet.ai.mit.edu:pub/scm/hobbit5x.tar.gz
 ftp.gnu.org:pub/gnu/jacal/hobbit5x.tar.gz
 ftp.cs.indiana.edu:/pub/scheme-repository/imp/hobbit5x.tar.gz

SLIB-PSD is a portable debugger for Scheme (requires emacs editor):
 swissnet.ai.mit.edu:pub/scm/slib-psd1-3.tar.gz
 ftp.gnu.org:pub/gnu/jacal/slib-psd1-3.tar.gz
 ftp.cs.indiana.edu:/pub/scheme-repository/utl/slib-psd1-3.tar.gz

SMG-SCM is an SMG interface package which works with SCM on VMS.
 swissnet.ai.mit.edu:pub/scm/smg-scm2a1.zip
 ftp.gnu.org:pub/gnu/jacal/smg-scm2a1.zip
 ftp.cs.indiana.edu:/pub/scheme-repository/imp/SCM-support/smg-scm2a1.zip
A VMS version of Unzip is available by anonymous FTP from
 ftp.spc.edu:[ANONYMOUS.MACRO32]UNZIP.EXE.

TURTLSCM is a turtle graphics package which works with SCM on MS-DOS
or X11 machines:
 swissnet.ai.mit.edu:pub/scm/turtlegr.tar.gz
 ftp.gnu.org:pub/gnu/jacal/turtlegr.tar.gz
 ftp.cs.indiana.edu:/pub/scheme-repository/imp/SCM-support/turtlegr.tar.gz

XSCM is a X windows interface package which works with SCM:
 swissnet.ai.mit.edu:pub/scm/xscm-2.01.tar.gz
 ftp.gnu.org:pub/gnu/jacal/xscm-2.01.tar.gz
 ftp.cs.indiana.edu:/pub/scheme-repository/imp/SCM-support/xscm-2.01.tar.gz

MacSCM is a Macintosh applications building package which works with
SCM (similar to XSCM).
 swissnet.ai.mit.edu:pub/scm/macscm.tar.Z
 ftp.cs.indiana.edu:/pub/scheme-repository/imp/SCM-support/macscm.tar.gz

WB is a disk based, sorted associative array (B-tree) library for SCM.
Using WB, large databases can be created and managed from SCM.
 swissnet.ai.mit.edu:pub/scm/wb1a2.tar.gz
 ftp.cs.indiana.edu:/pub/scheme-repository/imp/SCM-support/wb1a2.tar.gz

SIMSYNCH is a digital logic simulation system written in SCM.
 swissnet.ai.mit.edu:pub/scm/synch1a2.tar.gz
 ftp.gnu.org:pub/gnu/jacal/synch1a3.tar.gz

DLD is a C library package allowing SCM to dynamically load object
files on VAX (Ultrix), Sun 3 (SunOS 3.4 and 4.0), SPARCstation
(SunOS 4.0), Sequent Symmetry (Dynix), Atari ST, and a.out Linux
systems.
 ftp.gnu.org:pub/gnu/dld-3.3.tar.gz

SCMLIT.EXE (150k) is a no-frills compilation of SCM for DOS and MS-Windows.
Note: SCMLIT still requires slib2c5 and scm5d0 above.

#! implements "#!" (POSIX) shell-scripts for MS-DOS batch files.
 swissnet.ai.mit.edu:pub/scm/#!.zip

				-=-=-

  ftp swissnet.ai.mit.edu (anonymous)
  bin
  cd pub/scm
  get scm5d0.tar.gz
  get slib2c5.tar.gz
or
  ftp ftp.gnu.org (anonymous)
  bin
  cd pub/gnu/jacal
  get scm5d0.tar.gz
  get slib2c5.tar.gz

  `scm5d0.tar.gz' is a gzipped tar file of the C code distribution.
  `slib2c5.tar.gz' is a gzipped tar file of a Scheme Library.

Files in these directories with the ".gz" suffix are compressed with
patent-free gzip (no relation to zip).  The program to uncompress them
is available from
 ftp.gnu.org:pub/gnu/gzip-1.2.4.tar
 ftp.gnu.org:pub/gnu/gzip-1.2.4.shar
 ftp.gnu.org:pub/gnu/gzip-1.2.4.msdos.exe

Remember to use binary mode when transferring the files.
Be sure to get and read the GNU General Public License (COPYING).
It is included in scm5d0.tar.gz.

I sell IBM PC floppy disk sets with the source files, documentation,
and MS-DOS and i386 MS-DOS executables for $99.00.  To order, send
e-mail to jaffer @ rice-chex.ai.mit.edu.
