Imported latest S9core. No user-visible changes.


	Merged S9core fix by Micah Stetsion: s9core GC should never close
	the current input or output port. Does not affect Scheme 9, but
	is might affect other languages (like Klong). Thanks, Micah!

	Fix: APPLYing a function to more than CHUNK_SIZE (1024) arguments
	would result in a core dump. (Not that doing this is a good idea,
	but it should work none the less).  The fix is SLOW. Be warned!


	Fix: DISPLAY, WRITE, and REPL output could not be interrupted
	by pressing INTR. (s9.c)


	Exported tag() macro of S9core. (s9import.h)

	Removed unused "Error" variable and misc. cosmetic changes.


	Removed 16-bit support. It was mostly a lie anyway. (s9core.h)

	Applied various fixes to TROFF mode in EDOC. (prog/)


	Fix: EDOC generated index commands that were not contained in
	separate lines in TROFF mode. (prog/)

	Fix: C2HTML created spurious \fP in TROFF mode. (contrib/)

	Fix: ptrdiff_t should be vlong on 64-bit Plan 9. (s9core.h)


	Fix: LOCATE-FILE did not decode leading ~ in path names properly.

	Misc. code clean-up. (s9.c, s9core.*)


	Added S9core self-test to Plan 9 tests. (mkfile)

	Fixed some minor bugs that kept S9 from compiling on Plan 9.


	Updated TROFF macro package for EDOC. (prog/)

	Corrected LOCATE-FILE help page. (help/)

	Fix: REVERSE! can no longer reverse immutable lists. (s9.c)

	Removed left-over help page. (help/)

	Added S9core self-test to tests. (Makefile)

	S9core: adjusted size of internal GC protection stack, because
	real_power() can recurse frequently. (Note: real_power() is not
	used by S9fES). (s9core.c)


	Merged Linux/POSIX patches from Barak Pearlmutter's
	downstream repository (

	Disabled some system extension tests that failed on
	some platforms, probably due to wrong use of SYS:FORK.
	To be investigated! (util/systest.scm)


	Added TROFF output mode to EDOC. (prog/)


	Added TROFFIFY-CHAR function for escaping dangerous chars in
	TROFF. (lib/)


	EVAL context is now saved per file in LOAD, instead of per
	expression. (s9.c)


	S9core uses a more efficient way to GC-protect internal nodes
	now, resulting in a 20% to 30% increase in real and bignum
	performance. (s9core.c)

	STRING-APPEND and VECTOR-APPEND now allocate only one single
	fresh vector when appending multiple arguments. They basically
	folded over their arguments before. (s9.c)


	The / procedure signals an error now when the divisor is 0.
	Use CATCH-ERRORS to intercept this condition and deliver
	some value. (s9.c)

	(Expt 0 0.0) and (log x) for non-positive x now signal a range
	error. (s9.scm)

	Fixed some type mismatches in the 64-bit build.

	Removed 64-bit build option from Makefile and README.
	*** Note: S9 will still build on 64-bit systems, but will use
	*** 32-bit structures internally. This should not make any
	*** difference to anybody. If it does, let me know!


	Factored out MAKE-HELP-INDEX procedure. (lib/)

	LIST->SET now uses a hash table when its argument exceeds
	a certain size.

	Misc. small changes to S9core. (s9core.*, s9import.h)


	Cleaned up help directory: removed left-over pages, linked
	missing pages. Reorganized the help system structure so that
	no links, symlinks, or duplicate files are needed. INDEX
	files are now local to subdirectories of help/.

	Retired FIND-HELP-PATH and FIND-HELP procedures from the
	SYS-UNIX extension.

	Retired S9SYMBOLS command. (prog/)

	Added FIND-HELP-PAGE procedure, which returns the full path
	of the help file describing a given syntactic keyword or
	procedure (or #F if no such page exists). (lib/)

	Added SCAN-HELP-PAGES procedure, which searches all help pages
	for a given keyword. This procedure replaces FIND-HELP. Unlike
	FIND-HELP it does not require the SYS-UNIX extension. (lib/)

	Updated S9HELP command and added -c (check database) option.

	Major Change: argument passing to extension procedures


	As of this release, arguments to extension procedures (extprocs)
	are passed on the stack. In functions implementing extprocs, the
	n'th argument is now retrieved by calling parg(n). The number
	of arguments is returned by narg(). The extproc handler type
	was changed from  cell (*f)(cell x)  to  cell (*f)(void).

	All extproc handlers need to be adapted to use the new calling
	conventions. The csv, curses, and sys-unix extensions already
	have been modified accordingly.


	In previous versions of S9fES arguments were passed as lists.
	This method was still used in S9 Reimagined when applying
	extension procecures. However, this approach required to
	convert arguments on the stack to lists before passing them
	to extension procedures. This caused unnecessary consing.


	Retired Plan 9 system extension (ext/sys-plan9). Please see for a more up to date version.

	Note that S9fES will continue to compile and run on Plan 9,
	but the stock version will no longer provide functions like
	SYS:OPEN, SYS:BIND, etc. Use Bakul's version if you need

	Replaced symlinks in help/ with links (which will hopefully
	extract to copies on non-Unix systems).


	Added bytecode disassembler. (lib/disassemble.scm)

	Fixed a bug in the library test suite ("make libtest") that
	would report a failed image load when upgrading to a new
	version. (util/)


	Added system() function for Plan 9 to S9core. Thanks, Bakul!

	Fix: PROCEDURE? returned #F for extension procedures. (s9.c)

	Retired lib/catch.scm (moved from lib/ to attic/).


	Removed symbolic links from help/ directory, because some
	operating systems do not have symlinks and tar(1) may report
	errors in this case. The symlinks will be rebuild (or files
	copied) during the build process. (help/)
	Thanks, Bakul, for the suggestion!

	Added S9:BYTECODE operator for accessing the bytecode of a
	procedure. (s9.c)

	Fix: aborting interpreter start-up when an image load fails.


	Installed patches for the Plan 9 build submitted by Bakul Shah
	and McKay Marston. Thank you very much! (If it still does not
	work, it's my fault alone!)

	Fix: reference trace was in wrong order in error messages. (s9.c)

	Fix: GC leak in the compiler. (s9.c)

	Added CATCH-ERRORS form. (s9.c, s9.scm)


	Added CATCH and THROW procedures. (s9.c)

	Error messages are now printed to stdout unless the interpreter
	is run in quiet mode (which is implied when running programs in
	batch mode). (s9.c)

	Fix: SIGINT was caught in quiet mode. (s9.c)

	Longjmp'ing out of a signal handler may cause portability issues,
	even if POSIX allows it. Worked around it. (s9.c)
	Thanks, Bakul Shah, for pointing this out!

	util/fix-help-links is now called util/ (for Unix)
	and util/fix-links.rc (for Plan 9). (util/)


	Policy change: image files are now loaded from the directory
	specified in the S9FES_IMAGE_DIR environment variable or from
	*one* directory specified in IMAGE_DIR (s9.c). When no image
	can be found there, "./s9.image" will be tried. When this fails,
	too, the interpreter will not start.

	To load the library source code, "s9 -i -" *must* be used; this
	is no longer a fallback.

	feature ID's to COND-EXPAND, so you can distinguish between the
	old and new S9 version. (lib/)

	Added the *RELEASE-DATE* top-level variable that is bound to a
	copy of the compiled-in RELEASE_DATE of the interpreter. (lib/)
	Thanks for the idea, Peter!



	This is a complete rewrite of most of the S9fES interpreter
	with the following highlights:

	- the S9 system now uses a bytecode compiler and abstract
	  machine (earlier versions used a tree walker)

	- the S9 interpreter now uses shallow binding instead of
	  deep binding. This means that

		- symbol lookup is now O(1) (was O(n log n))
		- closure creation is now O(n) (small n, was O(1))

	- the compiler inlines most standard Scheme procedures and
	  lambda-lifts functions when called immediately. That is,
	  ((lambda (x) y) z) will not create a closure (unless Y
	  uses SET!).

	- the table of interned symbols is a hash table now instead
	  of a list.

	- Lots of bugs were fixed in SYNTAX-RULES, but it is still
	  not fully hygienic and a second-class member of S9. Use
	  low-level macros instead!

	New syntax:

	- The IF* syntax is similar to IF:

	  (IF* <true-value> <alternative>)  ==>  <true-value>
	  (IF* #f <alternative>)            ==>  <alternative>

	  (IF* X Y) can be thought of as a very efficient version of

	  (let ((t x)) (if t t y))

	  It is used internally to implement (COND (X)) and OR.

	New procedures:

	- DUMP-IMAGE creates an image file

	- QUIT exits the interpreter

	- CURRENT-ERROR-PORT returns a port that is connected to stderr

	- OPEN-APPEND-FILE is like OPEN-OUTPUT-FILE, but appends output
	  to the given file

	- COMMAND-LINE returns the command line arguments passed to a
	  program (was: ARGV, still available).

	- ENVIRONMENT-VARIABLE looks up an environment variable
	  (was: ENVIRON, still available)

	- SYSTEM-COMMAND runs a shell commend (was: SYSTEM, still

	Minor changes:

	- the "-f file" command line option is deprecated; use "file"

	- strings can now contain \n (newline) escape sequences

	- CALL/CC is working properly and passes all Petrofsky tests.
	  It is rather expensive, though!

	- *LIBRARY-PATH* is now in list format (was a Unix PATH-style

	- *IMAGE-FILE* names the image file in use (or is set to #f).

	- the initial image file is loaded from the directory specified
	  in the S9_IMAGE_DIR environment variable

	- EVAL is now a single-argument function.

	- GENSYM is now a function of no arguments.

	- the STATS function no longer counts reduction steps, but does
	  count allocated vector cells.

	- the BIT-OP function signals an error in case of an overflow or
	  wrong opcode instead of returning #F.


The change log of S9fES (Reimagined) ends here.
For previous changes, see the file PREHISTORY.

contact  |  privacy