$Id$ Changes between 3.0 and 4.0: ---------------------------- * Not released yet. * New in 3.99.3 prerelease (rev 157): + Minor bugs fixed. * New in 3.99.2 prerelease (rev 151): + Ported to HP-UX. + Ported to Windows (both Cygwin and Mingw32) except the plugin system. + More bugs fixed. * New in 3.99.1 prerelease (rev 126): + Ported to Mac OS X. + Added proper checks for the libraries (libgdbm, X11, Motif, ...). + Added a ChangeLog file. + libelf is no longer an absolute requirement, though it is still strongly recommended. * New in 3.99.0 prerelease (rev 96): + libelk, a shared library containing all the Elk scheme interpreter features. + Properly builds with GCC 3. + 64 bits clean. + Uses autoconf, automake and libtool for greater portability and a simpler build and installation process. + Support for dynamically loadable plugins. Previous versions used the system's linker to build shared objects at runtime. + Massive bugfixing. + Dump support was removed because it was too platform-specific and could not be thoroughly tested. I may enable it again in the future. Changes between 2.2 and 3.0: ---------------------------- General: * A new C/C++ Programmer's Manual for Elk is now available (60+ pages with many examples). See doc/README (item `cprog') and doc/cprog. * The documentation has been prepared for translation to HTML using the (Elk-based) `unroff' package. * Elk now uses a new Scheme object representation (a `struct' rather than an `unsigned long') to make it work on 64-bit architectures and to allow for larger heaps, a wider range of fixnums, and more first-class Scheme types. * As a consequence, the `pointer_constant_high_bits' are gone, as is util/pchb.c. * Elk has been ported to and tested on these new platforms (config files are included in the distribution): DEC/Alpha, OSF/1 HP 9000, HP-UX 10.0 i386/486, BSDI BSD/OS i386/486, Linux IBM PowerPC, AIX 4.1 * A number of config files for obsolete platforms have been removed from the distribution; config files for platforms where Elk 3.0 could not be tested are in config/untested. util/sgihack.c is gone. * Extension initialization and finalization functions now begin with `elk_init_' rather than just `init_' to avoid name conflicts. * The directory `contrib' has been removed from the distribution, as most of the contributions either were no longer maintained or have been made an official part of the distribution. contrib/eval-string is now available as lib/misc/elk-eval.c. * Site/platform-specific information such as the various X11 `load libraries', machine name, operating system name, as well as the Elk version number are now available as Scheme variables in scm/siteinfo.scm. The file is created automatically and can be loaded via `(require 'siteinfo)'. * Most of the improvements in scm/debug-new.scm have been merged into the baseline debug.scm and the former has been removed. The inspector now starts at the correct frame when called after an error. * examples/CC/class.c is a simple Elk extension demonstrating encapsulation of a C++ class in a Scheme type. * The file README has been renamed ROADMAP; RELEASE is now README. Interpreter kernel: * Many bugs have been fixed, and the code has been made `64-bit clean'. * New functions for application writers to read/set the `error tag' displayed in error messages and the application name (Get_Error_Tag, Set_Error_Tag, Set_App_Name). * When dynamically loading objects, the C++ static constructors are now called _before_ all extension initializers. Ditto for C++ destructors and extension finalizers. * New function for application/extension writers to load a file whose name is given as a C string (Load_File). * Load_Source_Port has been made `official' and may be used from outside the interpreter. * New functions for application/extension writers to convert Scheme numbers to C unsigned int/long: Get_Unsigned, Get_Unsigned_Long, Get_Exact_Unsigned, Get_Exact_Unsigned_Long. New function Get_Exact_Long. * The `round' primitive now rounds to even for numbers halfway between two integers. * The reader doesn't impose a limit on the length of strings and symbols any longer. * The dynamic loading implementations now use the environment variable TMPDIR if present. * `dump' now works under SGI Irix 5.x. * New constants ELK_MINOR and ELK_MAJOR for application/extension writers. * Symbols containing special characters now print correctly when output with `write'. * Various optimizations in the interpreter's inner loop to compensate for the performance loss caused by the struct-based object representation on some platforms. Extensions: * The X11 extensions now work with X11 Release 6, Sun OpenWindows 3.x, and Sun Motif. * Extension-specific include files (unix.h, xlib.h, xt.h) are now installed in a subdirectory $install_dir/include/extensions for use by applications. * The object files for Athena or Motif widgets are now loaded by means of `require'. * New POSIX-style regular expression extension (see doc/regexp and examples/regexp). * The file hunk.c has been removed from lib/misc, as it no longer serves any purpose. * Several bugs have been fixed in the UNIX and X11 extensions. Changes between 2.1 and 2.2: ---------------------------- General: * Elk ported to new platforms: SGI Irix 5.1, HP-UX 9.0 * All Scheme files now end with the suffix `.scm' * Introduced new symbols in the config files to be used by the UNIX extension * Reorganized the include files. Split external declarations into `private' (intern.h) and `public' (extern.h) declarations to be used by extensions * It's no longer necessary to specify multiple destination directories in the site file (only install_dir; subdirectories are created automatically) * `init_objects' is gone from the site file, see INSTALL for a new, simpler way to link extensions or an application with Elk statically * New directory $install_dir/lib is created with files module.o, standalone.o and shell scripts linkscheme, makedl, and ldflags (see INSTALL) * Elk can now be used by applications that must have their own main() function. See INSTALL for details. Interpreter kernel: * New primitives to allow blocking of signals from within Scheme code: disable-interrupts, enable-interrupts * Changed Disable_Interrupts and Enable_Interrupts macros to allow nesting and to handle signals used by extensions (specifically by the new UNIX extension) * Extended representation of continuations to carry current interrupt nesting level and restore it when being called * (Re-)enable interrupts in toplevel on error * Added default signal handlers for SIGPIPE and SIGHUP to clean up temporary files * New primitive: `features' * `require' now appends .scm to feature name to obtain file name (if no file name has been specified and if the feature name doesn't have a suffix yet) * Features elk:dump and elk:load-object are provided by the interpreter if dump and dynamic loading are supported * Implemented Register_Onfork() and Call_Onfork() to provide `fork handlers' (used, for instance, by the UNIX extension) * Added fork handlers to the dynamic loading implementations to create links for the temporary files * Added a close function to I/O ports to allow for pipe-based ports * New primitive: char-ready? * Added a check to the code that restarts a dumped interpreter to detect that the start address of the stack has been moved with respect to the original invocation (this happens between Sun-4c and Sun-4m architectures, for instance) * Modified math.c to implement the distinction between exact and inexact numbers as required by the language definition * New primitives: exact->inexact, inexact->exact * The number prefixes #e and #i are now supported * Floating point numbers are no longer automatically reduced to integers; new conversion function Make_Flonum(double) in addition to Make_Reduced_Flonum(double) * Added new conversion functions to cleanly distinguish between C ints and longs: Get_Long(Object), Make_Long(long), Make_Unsigned_Long(unsigned long), and functions to convert bignums from/to C longs * New conversion functions for exact integers: Get_Exact_Integer(Object) and Get_Exact_Long(Object) * Removed the unique `void' type; #v is now converted into the empty symbol by the reader; void? remains for compatibility * Implemented reader table for #-syntax * New function Define_Reader() to allow extensions to register their own read syntaxes (used by the new bitstring extension) * Exported parts of the reader to simplify writing new reader functions in extensions * New functions/macros to convert Scheme strings and/or symbols into C strings (to be used by extension writers): Get_String, Get_Strsym, Get_String_Stack, Get_Strsym_Stack; see src/cstring.c * Now obsolete: Declare_C_Strings, Dispose_C_Strings, Make_C_String * Bug fixes: o fixed a few bugs in the implementation of continuations and tail call optimization and in the generational, incremental garbage collector o there was a bug in the interaction between the garbage collector and `dump' o identified additional critical sections to be protected from delivery of signals o initscheme.scm wasn't resolved against the load-path o quasiquotation now also works for vectors (kudos to Tor Lillqvist for suggesting a simple fix) o a bug in src/load-ld.c could cause the first static variable in a dynamically loaded .o file to not be zeroed Extensions: * New UNIX extension; see doc/unix for the reference manual and examples/unix for a few demonstration programs * New record extension; see doc/record for the reference manual. The `struct' extension is now obsolete * New arbitrary-length bitstring extension; see doc/bitstring for the manual Changes between 2.0 and 2.1: ---------------------------- General: * New configuration files for the 386/486-PC running 386BSD and DOS/DJGPP, for Suns running Solaris 2.1 (SunOS 5.1, and for the Convex C230 running ConvexOS. * Reorganized the config files and the site file to allow for configuration of the generational, incremental garbage collector * Introduced several new symbols in the config files to simplify installation on several systems * Added new targets to all Makefiles to allow `cross-localization' of the source tree (see comments in DOS section in MACHINES) Interpreter kernel: * Added a generational, incremental garbage collector * New primitives: garbage-collect-status, collect-incremental * Reorganized the source files to accommodate the new garbage collector and to separate garbage collector specific code from code common to both garbage collectors * Empty list no longer counts as false; added primitive `empty-list-is-false-for-backward-compatibility' * Changed delimiter character in load-path argument of -p option from comma to colon * Initialize load-path from ELK_LOADPATH environment variable (if present) * Added argument to -v option to control which messages to print (linker command, init/finit functions) * It's no longer considered an error if an object file contains no initializers * Completely rewritten implementations of `dump' for ELF (SysVR4, Solaris 2.x), ECOFF (Ultrix, Irix), and HP9000 a.out formats; the HP version now correctly handles shared libraries * Added support for dynamic loading under SysVR4 and Solaris 2.x (see comments in MACHINES) * Added code to read symbol table of object files on the Convex * Bug fixes: o dynamic-wind was completely broken; fixed it o fixed a bug in the code that checks for the stack growing direction (caused dumped images to crash on startup) o fixed a bug in the equal? predicate (could enter an infinite loop when applied to environments) * Fixed a number of portability problems, among them: o added O_BINARY flag to open() calls and "b" mode to fopen() calls where necessary o added support for the many different ways to purge a file pointer and tty file descriptor (src/read.c, src/print.c) * Integrated the functionality of the `libutil.a' library from older releases into the interpreter kernel (conversion of symbols and lists of symbols to bit masks and vice versa; routines to manage a pool of weak pointers to objects, used mainly by the Elk X extensions Extensions: * Removed libutil.a (lib/util/*); moved the code into the interpreter kernel (src/terminate.c; src/symbol.c); removed libutil.a from the default load-libraries * Renamed lib/misc/c++.[co] to lib/misc/newhandler.[co] (c++.c isn't a valid filename under DOS) * Added finit function to lib/misc/monitor.c to switch off monitoring and write mon.out on exit Elk/X: * The X extensions are no longer pre-linked against the required X libraries (by means of ld -r); resolving against system libs now always takes place at load time * make-gcontext and copy-gcontext now can be called with a drawable (i.e. pixmap or window) * New primitives: alloc-color alloc-named-color * Removed window-unique-id primitive * Fixed a few bugs in the Xt extension (editres now works with Scheme programs); removed an artificial limitation * Defined a GC visit function for widgets that visits each widget's parents and the children of composite widgets * Added support for Motif gadgets Changes between 1.5 and 2.0: ---------------------------- General: * The build and install process has been improved significantly (see file INSTALL) * Added a new directory "config" that holds the system-specific configuration files and the site-file * Added a build shell script and a unified Makefile to all directories; "build" creates the ``real'' Makefiles containing system- and site-specific details during the make process * Added install, lint, clean, and distclean targets to all Makefiles * Placed files that are needed during runtime (dynamically loadable object files, Scheme files, the interpreter itself) into separate directories; added "make install" to put files there * Simplified porting Elk to new systems (assembly language support and a stack-extending version of "alloca" are no longer required) * Tested on several new systems (IBM RS/6000, HP9000/700, SGI, Sony; see the file MACHINES) * Placed new files CONTRIBUTORS, MIGRATE, and TODO into the toplevel directory of the distribution * Added a directory "util" that contains tools to simplify porting Elk to new environments and other utilities that are useful on some systems * Added a directory "scripts" that holds the shell scripts used to link instances of the interpreter and extensions. * Removed "stk" directory with test programs (no longer needed) * Added ANSI C prototypes and C++ "extern C" to all include files Interpreter kernel: * Placed include files into a separate directory (include) * Reorganized the source files (separate source files for different a.out formats and different dynamic loading mechanisms) * Changed the way new Scheme objects are allocated to support the generational garbage collector (not yet present in Elk) * Rewrote the code implementing continuations to support full call/cc on all machines * Fixed tail recursion optimization * Added support for POSIX signals (as alternative to BSD reliable signals) * Removed several artificial limitations (such as max. number of before-GC and after-GC functions and statically GC-linked objects) * Removed code that depended on max. number of open files per process * Added bi-directional ports (input-output-ports); new primitive: open-input-output-port * New primitive: port-line-number * Reader now prints line number on syntax error * Max. length of a pathname is now determined correctly (using the POSIX incantations if applicable) * Added code to support dynamic loading under HP-UX (src/load-shl.c) * Added code to call extension finalization functions and C++ destructors on termination * Fixed and improved the code to call extension initialization functions and C++ constructors on startup or when loading extensions * Improved the mechanism to suppress initialization of statically linked extensions on startup ("dont_init_if_name" in config/site) * Can use ANSI "atexit" as alternative to redefining "exit" * Added option -p to specify load path * Scheme file "initscheme" is now loaded before the toplevel is loaded * Changed "rand" to use rand() if random() isn't there * re-entrant-continuations? primitive is no longer needed (returns always #t now) * Added a general mechanism to register termination functions for individual objects (e.g. to close files on GC); see src/terminate.c * linkscheme shell script improved; added code to support the stupid AIX linker * Fixed numerous things that caused lint or "gcc -ansi" to complain * Changed the dynamic loading, "dump", and a.out symbol table reading code in numerous places to make it work on new systems and to make it more readable and maintainable Extensions: * Combined lib/util/symbol.o and lib/util/objects.o into new library libutil.a; put this library into the default "load-libraries" * Moved lib/util/string.c and lib/util/string.h into the interpreter * Moved files from lib directory into new subdirectory "misc" * Added POSIX sysconf stuff to unix.c to determine max. number of open files per process Elk/X: * Made the code mostly "lint clean" and "gcc -ansi clean" * Fixed bogus variable definitions in xlib.h and xt.h * Xlib: added support for client-message event * Xt: added code to avoid a bug in Motif 1.1.4 * Xt: added optional "mask" argument to context-add-input * Removed site-dependent information from scm/xwidgets (file is now created from scm/xwidgets.src during the build process) * Renamed widget .d files that were longer than 14 characters; added ALIASES file for each widget set containing mappings from real widget names to short names Documentation: * Added sub-directory "paper" containing a draft version of a paper about Elk User-contributed extensions: * A foreign function interface, an Elk Shell, and a vector extension have been contributed by J. P. Lewis (contrib/zelk). Changes between 1.4 and 1.5: ---------------------------- General: * Added a "contrib" directory for user-contributed extensions that I have not fully tested and/or integrated into Elk * Renamed ORIGIN to COPYRIGHT Interpreter kernel: * Added support for the Amiga, A/UX and System V Release 4 (ELF a.out format) * Added special load-library for MIPS (-lc_G0) * Extension-interface: replaced Val() by Var_Set()/Var_Get() * Modified load, autoload, and require so that multiple .o-files can be loaded simultaneously * Added -1+ as a synonym for 1- * Bug fixes: o fixed a GC-related bug o fixed a bug that occurred when allocating a very large heap o fixed a bug in case-insensitive string comparison o fixed a bug in macro "when" o changed and clarified semantics of print-depth/print-length * IEEE 1178/R^4RS compatibility: o replaced close-port by close-input-port and close-output-port o added primitives caaaar .. cddddr o added peek-char primitive o added -i option for case-insensitive operation * Removed -bc option * Removed CBREAK-hack in read-char Elk/X: * Fixed several GC-related bugs (objects belonging to Xlib/Xt are no longer terminated by garbage collector when unreferenced) * Fixed a bug in the interface to the Grip widget * Modified code to load widgets to make use of new capability to load multiple .o-files Documentation: * Interpreter kernel: documented new functions, clarified some sections * Xlib/Xt: documented X-related behavior of garbage collector, pointed out GC-related pitfalls Changes between 1.3 and 1.4: ---------------------------- Interpreter kernel: * Support for the NeXT machines added * New primitive list? provided * Two bugs in the tail recursion code fixed * -v option to trace /bin/ld-calls * man-page written Elk/X: * Tested under X11R5 * X11R3 and earlier versions are no longer supported * The HP-widget code has been removed from the distribution * New Xlib-primitives: install-colormap uninstall-colormap list-installed-colormaps xlib-release-5-or-later? * Xt interface now supports actions and accelerator tables * Bug in set-context-fallback-resources! fixed * New Xt-functions: widget-name widget-translate-coordinates application-initialize context-add-action install-accelerators install-all-accelerators xt-release-5-or-later? * Support for new widget classes: menubutton panner porthole repeater simplemenu sme smebsb smeline stripchart tree * vpaned renamed to paned * Example programs have been moved into a new examples directory with sub-directories for Scheme, Xlib, Xaw, Motif * New Xaw example programs that demonstrate the new widget classes, accelerators, actions, etc. Other extensions: * Interface to the GNU gdbm-library