	   	   PC Scheme Version 3.03 Release Notes

  This document describes the changes in PC Scheme since version 2.0. 


PC Scheme 3.0 features
----------------------

  Version 3.0 contains bug fixes, significant enhancements over 2.0, and
has been upgraded to the latest Scheme Standard as defined by the "Revised
Revised Revised (R^3) Report on the Algorithmic Language Scheme." A copy 
of that report is now included in the 3.0 manuals.

  Also included in this document is a number of features which are not
documented in the Language Reference Manual nor the User's Guide, but
which may be useful for programming.

R^3 Report Changes
------------------

  1. #T and #F now replace #!TRUE and #!FALSE. #!TRUE and #!FALSE are
     still supported in 3.0, however their use is discouraged and they
     may not be supported in future versions.

  2. Quasiquote expressions may now be nested and are defined to work
     with vectors. The keywords UNQUOTE (",") and UNQUOTE-SPLICING (",@")
     are also now recognized.

  3. The defining form (DEFINE (<variable> <formals>) <body>) no longer
     expands into a NAMED-LAMBDA as specified in the Report. To support
     code written under earlier versions of Scheme, the global variable
     PCS-INTEGRATE-DEFINE may be set non-nil to force the expansion, or
     nil to conform to the Report. Its default value is #T.

  4. BOOLEAN? is a new procedure which indicates if an object is either
     #T or #F (ie., (BOOLEAN? #T) => #T).

  5. PROCEDURE? is a new procedure which indicates if an object is a
     procedure (ie., (PROCEDURE? CAR) => #T).

  6. The expression types NAMED-LAMBDA, REC, and SEQUENCE have been removed
     from the Report but will continue to be supported as extensions.

  7. The following procedures have been removed from the report, however
     they will continue to be supported as extensions:

	APPEND!, STRING-NULL?, SUBSTRING-FILL!, SUBSTRING-MOVE-LEFT!,
	SUBSTRING-MOVE-RIGHT!, OBJECT-HASH, OBJECT-UNHASH, 1+, -1+.

  8. The redundant procedure names <?, <=?, =?, >?, and >=? have been removed
     from the Report and will be supported in this release, however their use
     is discouraged and future versions may not support them.

  9. The syntax #!NULL (for the empty list) has been removed from the report.
     Its usage is also discouraged and may not be supported in the future.



Bug Fixes
---------

  1. DEFINE has been corrected to bind a variable in the correct environment.
     Earlier versions of PCS could incorrectly rebind variables defined in
     parent environments, if the variable did not exist in the defining
     environment.

  2. IMPLODE now flags an error if given a non-list object.

  3. NUMBER->STRING has fixes to correct problems with the '(heur) format.

  4. Shift/Break now correctly halts printing of circular lists.

  5. INPUT-PORT? and OUTPUT-PORT? have been corrected to return '() after the
     port is closed.

  6. Expanded Memory Scheme no longer requires the EMM page frame to be on a
     64kb boundary.

  7. Drawing a line from x1,y1 to x2,y2 and later erasing it in the
     direction x2,y2 to x1,y1 now correctly resets all the intermediate
     pixels.



Enhancements/New Features
-------------------------

  1. Graphics has undergone significant changes which are documented in the
     User's Guide and Language Reference Manual. Following is a synopsis of
     the changes:

	* The %GRAPHICS primitives now accept a seventh argument to specify
	  an exclusive-or when drawing pixels or lines.

	* A new %GRAPHICS function has been included which allows you to set
	  a clipping rectangle which subsequent drawing functions use. All
	  %GRAPHICS drawing routines now use the clipping rectangle.

	* New graphics functions:
	     (GET-PEN-COLOR)	- returns the pen's color.
	     (GET-PEN-POSITION) - returns the pen's position.
	     (POINT-COLOR)	- returns a point's color value.
	     (SET-CLIPPING-RECTANGLE! x1 y1 x2 y2) - set clipping rectangle.

	* Modes 14 and 16 for the EGA are now supported.

	* CLEAR-GRAPHICS no longer automatically switches into mode 4, but
	  remains in the current video mode. SET-VIDEO-MODE! will automati-
	  cally do a CLEAR-GRAPHICS after changing modes.

  2. EDWIN contains several changes to help in its performance and flexibility.

	* The file EDWIN.INI will be loaded if it exists within the PCS
	  directory. EDWIN.INI may contain code to customize the display,
	  or remap the keyboard. See EDWIN.INI for examples.

	* Edwin now loads into its own environment, EDWIN-ENVIRONMENT. This
	  reduces the number of variables in the USER-GLOBAL-ENVIRONMENT and
	  allows EDWIN to be removed via the new REMOVE-EDWIN command.

	* REMOVE-EDWIN is a procedure of no arguments which may now be called
	  to remove references to EDWIN so that it will disappear upon the
	  next garbage collection. Remember that if EDWIN was loaded from
	  SCHEME-TOP-LEVEL, the history will still contain pointers to EDWIN,
	  prohibiting it from being garbage collected. In that case, you must
	  perform a SCHEME-RESET prior to the garbage collect to remove all
	  references to EDWIN.

	* EDWIN will now query the user upon exiting Scheme, if its buffers
	  have been modified but not written back out to the file.

	* The time required to load files into EDWIN's buffer has been
	  significantly reduced.

  3. PC Scheme now contains an External Language Interface (XLI) to support
     the calling of subroutines written in other languages. XLI has been
     tested to work with assembly, C and Pascal. See the chapter "External
     Language Interface (XLI)" in the User's Guide for more information.

  4. Transcendental functions have been rewritten using XLI and
     use the 8087/80287 numeric coprocessor when it is available.
     Accuracy is true double-precision and performance is significantly
     improved, even without the 8087.  The complete source code of this
     XLI interface is included.  Refer to the chapter "External Language
     Interface (XLI)" in the User's Guide for more information.

  5. A semi-interpretive EVAL has been implemented. EVAL now works
     interpretively until it encounters a binding form (such as LAMBDA,
     LET, etc.), at which time the compiler will be invoked.

  6. READ-LINE has been implemented as a primitive operation and will now echo
     to the screen when called to read from the console.

  7. LIST-TAIL has been implemented as a primitive operation. Both LIST-REF
     and LIST-TAIL gain significant performance increases.

  8. Random I/O is now supported via SET-FILE-POSITION! and GET-FILE-POSITION.
     See the description in the Language Reference Manual.

  9. Binary file input and output is now supported via OPEN-BINARY-INPUT-FILE
     and OPEN-BINARY-OUTPUT-FILE procedures. See the description in the
     Language Reference Manual.

  10. The non-essential procedure STRING->NUMBER from the R^3 Report is now
      included. See the description in the Language Reference Manual.

  11. #\ESCAPE has been added as a system defined character.

  12. Enhanced error handling is now available, and DOS I/O errors now trap
      to the inspector, with extended error information available. Reference
      the User's Guide under the chapter "DEBUGGING" for information on
      defining your own error handler via *USER-ERROR-HANDLER*.

  13. New procedures EXPAND-MACRO-1, EXPAND-MACRO, and EXPAND. EXPAND-MACRO-1
      will expand the outer-level of some form once and return the expanded
      form, EXPAND-MACRO will repeatedly expand the outer-level form until it
      is no longer a macro, and EXPAND will expand the entire form (outer and
      inner level forms), returning an expansion.

	Example: (EXPAND-MACRO '(let ((a 1) (b 2)) (foo a b)))

      *** Note ***
	When expanding various forms with the above procedures, you may
	encounter references to primitive operations. These primitive oper-
	ations typically begin with one or more percent signs (%), are
	generally not available for direct use by the user, and may change
	in future versions of PC Scheme.

  14. The random number generator can be reseeded using the RANDOMIZE
      function.  See the description in the Language Reference Manual.



Corrections to the Manuals
--------------------------

The following corrections to the User's Guide should be noted.

   1. At the top of page 8-16, the request number to be used for the
      "swap" special service request was omitted.  The bullet that reads:

	* swap

      should be replaced with:

	* swap (request number = 1)

   2. On page C-1 the symbol "remap" is equated with interrupt 7fh.
      However, the comment just below it refers to interrupt 60h.
      The correct interrupt number is 7fh.  Therefore, the comment that reads:

	; This example uses the interrupt at 60h; refer to ...

      should be replaced with:

	; This example uses the interrupt at 7fh; refer to ...



Undocumented/Non-Standard Features
----------------------------------

The following features are undocumented features which may or may not be
supported in future releases. They certainly are not standard Scheme
features and prohibit portability, but may be useful in some cases.


  1. GRAPHICS-WINDOW is a function which may be useful in creating graphics
     windows. It is currently in an experimental stage, is not fully complete,
     and is subject to change. Still, it is useful in its current form, and
     you may try it out at your own risk.

     GRAPHICS-WINDOW is a "marker" function indicating that the next series
     of MIT graphics functions will execute relative to a specified window
     instead of the full screen. It takes one argument, a window object
     (a port), and returns a 2-list of 4-lists.  The first list is the
     clipping rectangle for the window's interior using window-centered 
     coordinates, expressed as (left top right bottom), for use by the MIT
     functions, and the second list is the same rectangle expressed in
     screen coordinates for use by %GRAPHICS.  It changes the graphics
     state known by the MIT functions and sets the clipping rectangle to
     correspond to the window's interior so that further use of the MIT
     functions will execute relative to the window instead of the full screen.
     Aside from setting the clipping rectangle, there are no other effects
     on %GRAPHICS.

     After executing GRAPHICS-WINDOW on a window for the first time, a call
     to CLEAR-GRAPHICS should be issued to set the pen position and color
     and erase the graphics plane under the window (which may erase text
     too if they share the same plane). Further graphics commands are 
     issued normally.

     To move from one graphics window to another, use GRAPHICS-WINDOW with 
     the next window.  Note that when you move to another window, the graphics
     state (window, pen color, and pen position) of the first window is
     forgotten.  You will need to save it off if you want to come back and
     start up where you left off.  The functions CURRENT-GRAPHICS-WINDOW,
     GET-PEN-COLOR, and GET-PEN-POSITION, executed before the switch, will
     give you this information.

     While executing relative to a window, CLEAR-GRAPHICS will not affect
     the entire screen.  To reset CLEAR-GRAPHICS to its initial state
     where it does affect the entire screen, do (GRAPHICS-WINDOW 'SCREEN)
     followed by (CLEAR-GRAPHICS).  Executing SET-VIDEO-MODE! any time will do
     this automatically.  Note that (GRAPHICS-WINDOW 'SCREEN) is not the same
     as (GRAPHICS-WINDOW 'CONSOLE); although the console generally matches the
     screen, it doesn't have to--it's a window in its own right.

  2. %LOGAND, %LOGIOR, %LOGXOR are procedures of two arguments and are used
     to perform the bitwise logical operations and, or, and xor. The
     arguments must be 15 bit integers.

  3. UNBIND is a procedure which may be used to remove bindings from
     environments. The call to unbind is as follows:

	   (UNBIND 'VAR ENV)

	     Where : VAR is the variable you wish to remove
		     ENV is any heap allocated environment, including the
			 user-initial and user-global environments.

     Unbind can be useful in providing user-assisted memory management.
     If an object which is auto-loadable is unbound via the UNBIND
     procedure, it may later be auto-loaded again. Therefore, if you
     define autoload lists, you can maintain some control over what
     code you desire in memory.

  4. Autoload information created from the function AUTOLOAD-FROM-FILE (see
     chapter titled "ADVANCED FEATURES" in User's Guide) is stored on a
     property list under the name PCS-AUTOLOAD-INFO. Scheme defines a number
     of autoload entries of its own, and any that you add will be consed
     onto the autoload list. You can see the autoload information by
     performing (GETPROP 'PCS-AUTOLOAD-INFO).

     The procedure AUTOLOAD-FROM-FILE also takes an optional third argument
     which indicates the environment that you want the file loaded into. For
     example

       (autoload-from-file "DEFS.FSL" '(foo bar baz) user-initial-environment)

     will load the file "DEFS.FSL" into the user-initial-environment whenever
     foo, bar, or baz is referenced. The optional environment argument can
     be any heap allocated environment. To add or delete entries from the
     autoload list just write your own functions to modify the list, however
     if you remove any of the compiler dependent files from the list, a
     reference to one of its functions will cause errors.

     The undocumented procedure REMOVE-AUTOLOAD-INFO may be used to remove
     information from the autoload list. REMOVE-AUTOLOAD-INFO takes one
     argument, the filename of the autoload entry you wish to remove, and
     then removes the autoload information from the list. This function,
     along with UNBIND can be used to help the user perform memory manage-
     ment.

  5. MAKE-HASHED-ENVIRONMENT is a procedure of no arguments which creates
     an environment in the Scheme heap in the form of a hash table for
     better accessing. The hash table contains 211 entries; any time a
     variable is defined in that environment a hash key will be determined
     via an internal hash function to find the correct entry. This is
     identical to the user global and user initial environments. A hashed
     environment's parent is the user-initial-environment.

     A hashed environment will provide better access times than normal
     environments, given there are a lot of variables in the environment.
     However, there is certainly a space/time tradeoff to consider. The
     hashed environment contains much more overhead which will be wasted
     if you need only a handfull of variables.

     One advantage of the hashed environment, as with all environments,
     is that if you discard all references to the environment, it will
     be garbage collected and all the space may be reclaimed. This means
     that you must keep track of all variables or references which are
     exported to other environments. Also, if you define a macro within
     an environment, the macro definition holds a reference to the
     environment and will prohibit garbage collection of the environment.
     Macro definitions may be found under the property PCS*MACRO of the
     macro name declared.

  6. While the 3.0 implementation of transcendental functions is much
     faster and more accurate and therefore to be preferred, the 2.0
     version had the advantage of being about half the size.  If space is
     more important than speed or accuracy, you can do the following:

	1. Invoke PC Scheme as usual, except put a minus sign in front
	   of the .XLI control file name; this prevents XLI from
	   loading NEWTRIG.EXE.  For example:

		  pcs (my.ini -my.xli) arg1 arg2

	2. Inside PC Scheme, do:
	     (eval '(load "oldpmath.fsl") user-global-environment)
	   If your current directory is not the PC Scheme directory,
	   you'll need to append the value of the system variable
	   PCS-SYSDIR to the front of the filename.  The LOAD must be
	   inside the EVAL so that autoload references to pmath.fsl
	   will be intercepted correctly.

     It is not absolutely necessary to do step 1 just to use oldpmath.fsl,
     but the space savings won't be realized without it.  Also, step 2
     should be done soon upon entering PC Scheme, as various system
     functions, such as some Edwin commands, require the math functions
     (whether through XLI\pmath.fsl or through oldpmath.fsl) to be loaded.

PC Scheme 3.02 features
-----------------------
  
The following bugs have been fixed.

  1. There were several obscure bugs in the extended and expanded memory
     models of PC Scheme which have been corrected.  Also, extended memory
     performance has been enhanced by about 25%.

  2. PC Scheme 3.02 recognizes an IBM PS/2 Model 80.  IBM has assigned
     a new machine-type number to it, which is reflected in the value
     of PCS-MACHINE-TYPE.  More importantly, FREESP in extended memory
     PC Scheme now works correctly on the Model 80.

  3. EQUAL? on ports no longer causes a type mismatch error.

  4. There was a bug in determining the pathname of NEWTRIG.EXE when
     PC Scheme had been installed in the root directory.  This usually
     showed itself when running PC Scheme from floppy disks.

  5. In the form (SET! (ACCESS var env) value), there was a bug in which
     environment the "value" was placed if the "var" did not already exist.

  6. DOS-CALL no longer depends on the COMSPEC environment variable
     being listed first in the DOS environment.

  7. Line-lengths for binary files are now automatically set to zero
     so end-of-line sequences are suppressed.

  8. XLI checks for its version number.  PC Scheme 3.02 uses the same
     version number as 3.0.  The error message is "[XLI] Version mismatch".
     Also, the XLI error message "[XLI] The function requested by XCALL is not
     available" now is followed by the name of the function that failed.

  10. PC Scheme's definition of EQV? says "=" is used to compare numeric
     arguments.  However, MEMV and ASSV, which are supposed to use EQV?
     for their equality predicates, were really using EQUAL?.  "=" and
     EQUAL? return different results when two numeric arguments have
     different types, so the fix may cause a change of behavior in how
     MEMV and ASSV work.

  11. Internal "getmem" errors no longer cause an abort to DOS.
     Instead, the system performs a SCHEME-RESET.  The error generally
     appears during output of extremely large data structures when
     I/O buffer space is exhausted, but the data structures themselves
     remain intact, so this should be adequate recovery in most cases.

  12. A bug in SCOOPS was making the environments in which instance 
     variables got created be dependent on the order in which the
     classes were compiled.

The following features are "new" to PC Scheme 3.02.

  1. XLI can now receive error messages from external programs and drop into
     the Inspector displaying the error message. 

     The external program reports an error as follows.  It formats the
     parameter block with a string as return value, where the string is
     the error message.  However, instead of using a return-value type of
     2 (string), it should use a value of 10 (error-string).  XLI will
     drop into the Inspector with the error message "[XLI] Error reported
     by external program" followed on the next line by the external
     program's error message (note the Inspector uses WRITE to display
     the message).  The error is not restartable.

     If an external program using this error technique is run under
     PC Scheme 3.0, XLI reports the different error "[XLI] The return value
     of XCALL is invalid" and the external program's error message never
     appears.

     NEWTRIG.EXE has been reimplemented with this technique.  Refer to
     the file XLI\TRIG_LC.C to examine the source code.

  2. There are a couple more XLI source examples in the XLI directory.
     One is in assembly language, the other in C.  One provides PC Scheme 
     with sound capability, and the other demonstrates a way to run
     DOS-executable files without using DOS-CALL.

  3. %GRAPHICS for EGA has been reimplemented to do direct screen writes.
     This gives a significant performance boost at the expense of generality,
     which may affect some EGA clones.  Also, VGA modes 17 and 18 are now
     supported.

PC Scheme 3.03 features
-----------------------
  
The following bugs have been fixed.

  1. Random I/O has been fixed. If a file is opened with OPEN-EXTEND-FILE,
     one can perform both input from and output to that file.

  2. An obscure garbage collection bug was fixed which envolved one defining
     their own top-level. If a user top-level has been defined instead of
     the Scheme-Top-level, and an out of memory encountered an error message
     occurred on the next garbage collect.

  3. A garbage collection bug in extended memory was fixed. Compaction of
     list cells could sometimes cause problems.

  4. A problem with DOS memory fragmentation was fixed. Upon returning from
     PC Scheme, all of memory was not being returned to DOS. This could some-
     times cause other programs to fail with "not enough memory" errors.

The following new features have been added:

  1. Support has been added for VGA mode 18.


  2. One can now specify when garbage compaction should occur. 

	(GC-GET-COMPACT-COUNT! number) - specifies that a compaction should
					 occur after every "number" of gc's.

	(GC-GET-COMPACT-COUNT) 	       - returns the current "number".
