** New module (ice-9 time)
[bpt/guile.git] / NEWS
diff --git a/NEWS b/NEWS
index f171f80..0dbc9cd 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,5 @@
 Guile NEWS --- history of user-visible changes.  -*- text -*-
-Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
 See the end for copying conditions.
 
 Please send Guile bug reports to bug-guile@gnu.org.
@@ -8,9 +8,22 @@ Changes since Guile 1.4:
 
 * Changes to the distribution
 
-** New modules (oop goops) etc
+** New module (ice-9 stack-catch):
 
-The new modules
+stack-catch is like catch, but saves the current state of the stack in
+the the-last-stack fluid for the debugger to inspect or in able to
+re-throw an error.
+
+** The module (ice-9 and-let*) has been renamed to (ice-9 and-let-star)
+
+This has been done to prevent problems on lesser operating systems
+that can't tolerate `*'s in file names.  The exported macro continues
+to be named `and-let*', of course.
+
+On systems that support it, there is also a compatability module named
+(ice-9 and-let*).  It will go away in the next release.
+   
+** New modules (oop goops) etc.:
 
   (oop goops)
   (oop goops describe)
@@ -18,14 +31,8 @@ The new modules
   (oop goops active-slot)
   (oop goops composite-slot)
 
-plus some GOOPS utility modules have been added.
-
-* Changes to the stand-alone interpreter
-
-** GOOPS has been merged into Guile
-
-The Guile Object Oriented Programming System has been integrated into
-Guile.
+The Guile Object Oriented Programming System (GOOPS) has been
+integrated into Guile.
 
 Type
 
@@ -75,6 +82,48 @@ Asking for the type of an object
 See further in the GOOPS tutorial available in the guile-doc
 distribution in info (goops.info) and texinfo formats.
 
+** New module (ice-9 rdelim).
+
+This exports the following procedures which were previously defined
+in the default environment:
+
+read-line read-line! read-delimited read-delimited! %read-delimited!
+%read-line write-line
+
+For backwards compatibility the definitions are still imported into the
+default environment in this version of Guile.  However you should add:
+
+(use-modules (ice-9 rdelim))
+
+to any program which uses the definitions, since this may change in
+future.
+
+Alternatively, if guile-scsh is installed, the (scsh rdelim) module
+can be used for similar functionality.
+
+** New module (ice-9 match)
+
+This module includes Andrew K. Wright's pattern matcher:
+
+(use-modules (ice-9 match))
+
+(match '(+ 1 2)
+  (('+ x) x)
+  (('+ x y) `(add ,x ,y))
+  (('- x y) `(sub ,x ,y)))  => (add 1 2)
+
+See ice-9/match.scm for brief description or
+http://www.star-lab.com/wright/code.html for complete documentation.
+
+This module requires SLIB to be installed and available from Guile.
+
+* Changes to the stand-alone interpreter
+
+** Evaluation of "()", the empty list, is now an error.
+
+Previously, you could for example write (cons 1 ()); now you need to
+be more explicit and write (cons 1 '()).
+
 ** It's now possible to create modules with controlled environments
 
 Example:
@@ -87,28 +136,92 @@ Example:
 
 * Changes to Scheme functions and syntax
 
-** The "guardian" facility has changed (mostly compatibly).
+** The module system has been made more disciplined.
+
+The function `eval' will now save and restore the current module
+around the evaluation of the specified expression.  While this
+expression is evaluated, `(current-module)' will now return the right
+module, which is the module specified as the second argument to
+`eval'.
+
+A consequence of this change is that `eval' is not particularily
+useful when you want allow the evaluated code to change what module is
+designated as the current module and have this change persist from one
+call to `eval' to the next.  The read-eval-print-loop is an example
+where `eval' is now inadequate.  To compensate, there is a new
+function `primitive-eval' that does not take a module specifier and
+that does not save/restore the current module.  You should use this
+function together with `set-current-module', `current-module', etc
+when you want to have more control over the state that is carried from
+one eval to the next.
+
+Additionally, it has been made sure that forms that are evaluated at
+the top level are always evaluated with respect to the current module.
+Previously, subforms of top-level forms such as `begin', `case',
+etc. did not respect changes to the current module although these
+subforms are at the top-level as well.
+
+To prevent strange behaviour, the forms `define-module',
+`use-modules', `use-syntax', and `export' have been restricted to only
+work on the top level.  The forms `define-public' and
+`defmacro-public' only export the new binding on the top level.  They
+behave just like `define' and `defmacro', respectively, when they are
+used in a lexical environment.
 
-There are now two types of guardians: greedy and sharing.
+** `port-for-each' makes an additional guarantee.
 
-If you call (make-guardian #t) or without any arguments, you get a
-greedy guardian, else a sharing guardian.
+From the docstring: @var{proc} is applied exactly once to every port
+that exists in the system at the time @var{port-for-each} is invoked.
+Changes to the port table while @var{port-for-each} is running have no
+effect as far as @var{port-for-each} is concerned.
 
-Greedy guardians are made the default because they are more
-"defensive".  You can only greedily guard an object once.  If you
-guard an object more than once, then it is guaranteed that the object
-won't be returned from sharing guardians as long as it is greedily
-guarded.
+This guarantee is important to make (ice-9 popen) work reliable.
 
-The second change is making sure that all objects returned by
-guardians are properly live, i.e. it is impossible to return a
-contained object before the containing object.
+** The semantics of guardians have changed.
+
+The changes are for the most part compatible.  An important criterion
+was to keep the typical usage of guardians as simple as before, but to 
+make the semantics safer and (as a result) more useful.
+
+*** All objects returned from guardians are now properly alive.
+
+It is now guaranteed that any object referenced by an object returned
+from a guardian is alive.  It's now impossible for a guardian to
+return a "contained" object before its "containing" object.
 
 One incompatible (but probably not very important) change resulting
 from this is that it is no longer possible to guard objects that
 indirectly reference themselves (i.e. are parts of cycles).  If you do
 so accidentally, you'll get a warning.
 
+*** There are now two types of guardians: greedy and sharing.
+
+If you call (make-guardian #t) or just (make-guardian), you'll get a
+greedy guardian, and for (make-guardian #f) a sharing guardian.
+
+Greedy guardians are the default because they are more "defensive".
+You can only greedily guard an object once.  If you guard an object
+more than once, once in a greedy guardian and the rest of times in
+sharing guardians, then it is guaranteed that the object won't be
+returned from sharing guardians as long as it is greedily guarded
+and/or alive.
+
+Guardians returned by calls to `make-guardian' can now take one more
+optional parameter, which says whether to throw an error in case an
+attempt is made to greedily guard an object that is already greedily
+guarded.  The default is true, i.e. throw an error.  If the parameter
+is false, the guardian invocation returns #t if guarding was
+successful and #f if it wasn't.
+
+Also, since greedy guarding is, in effect, a side-effecting operation
+on objects, a new function is introduced: `destroy-guardian!'.
+Invoking this function on a guardian renders it unoperative and, if
+the guardian is greedy, clears the "greedily guarded" property of the
+objects that were guarded by it, thus undoing the side effect.
+
+Note that all this hair is hardly very important, since guardian
+objects are usually permanent.
+
 ** Escape procedures created by call-with-current-continuation now
 accept any number of arguments, as required by R5RS.
 
@@ -194,11 +307,46 @@ Guile.
 
 Instead, use scm_c_memq or scm_memq, scm_memv, scm_member.
 
+** New function: read-string!/partial str [port_or_fdes [start [end]]]
+
+     Read characters from an fport or file descriptor into a string
+     STR.  This procedure is scsh-compatible and can efficiently read
+     large strings.  It will:
+
+        * attempt to fill the entire string, unless the START and/or
+          END arguments are supplied.  i.e., START defaults to 0 and
+          END defaults to `(string-length str)'
+
+        * use the current input port if PORT_OR_FDES is not supplied.
+
+        * read any characters that are currently available, without
+          waiting for the rest (short reads are possible).
+
+        * wait for as long as it needs to for the first character to
+          become available, unless the port is in non-blocking mode
+
+        * return `#f' if end-of-file is encountered before reading any
+          characters, otherwise return the number of characters read.
+
+        * return 0 if the port is in non-blocking mode and no characters
+          are immediately available.
+
+        * return 0 if the request is for 0 bytes, with no end-of-file
+          check
+
+** New function: object->string OBJ
+
+Return a Scheme string obtained by printing a given object.
+
 ** New function: port? X
 
 Returns a boolean indicating whether X is a port.  Equivalent to
 `(or (input-port? X) (output-port? X))'.
 
+** New function: file-port?
+
+Determines whether a given object is a port that is related to a file.
+
 ** New function: port-for-each proc
 
 Apply PROC to each port in the Guile port table in turn.  The
@@ -210,7 +358,7 @@ A simple wrapper for the `dup2' system call.  Copies the file
 descriptor OLDFD to descriptor number NEWFD, replacing the
 previous meaning of NEWFD.  Both OLDFD and NEWFD must be integers.
 Unlike for dup->fdes or primitive-move->fdes, no attempt is made
-to move away ports which are using NEWFD\n".  The return value is
+to move away ports which are using NEWFD.  The return value is
 unspecified.
 
 ** New function: close-fdes fd
@@ -221,6 +369,53 @@ close: Ports and File Descriptors.), the file descriptor will be
 closed even if a port is using it.  The return value is
 unspecified.
 
+** New function: crypt password salt
+
+Encrypts `password' using the standard unix password encryption
+algorithm.
+
+** New function: chroot path
+
+Change the root directory of the running process to `path'.
+
+** New functions: getlogin, cuserid
+
+Return the login name or the user name of the current effective user
+id, respectively.
+
+** New functions: getpriority which who, setpriority which who prio
+
+Get or set the priority of the running process.
+
+** New function: getpass prompt
+
+Read a password from the terminal, first displaying `prompt' and
+disabling echoing.
+
+** New function: flock file operation
+
+Set/remove an advisory shared or exclusive lock on `file'.
+
+** New functions: sethostname name, gethostname
+
+Set or get the hostname of the machine the current process is running
+on.
+
+** New function: open-input-string string
+
+Return an input string port which delivers the characters from
+`string'.  This procedure, together with `open-input-string' and
+`get-output-string' implements SRFI-6.
+
+** New function: open-output-string
+
+Return an output string port which collects all data written to it.
+The data can then be retrieved by `get-output-string'.
+
+** New function: get-output-string
+
+Return the contents of an output string port.
+
 ** Deprecated: close-all-ports-except.  This was intended for closing
 ports in a child process after a fork, but it has the undesirable side
 effect of flushing buffers.  port-for-each is more flexible.
@@ -233,12 +428,44 @@ current values of file descriptors 0, 1, and 2 in the parent process.
 
 There is no such concept as a weak binding any more.
 
-** Removed constants:  bignum-radix
+** Removed constants:  bignum-radix, scm-line-incrementors
+
+** define-method: New syntax mandatory.
+
+The new method syntax is now mandatory:
+
+(define-method (NAME ARG-SPEC ...) BODY ...)
+(define-method (NAME ARG-SPEC ... . REST-ARG) BODY ...)
+
+  ARG-SPEC ::= ARG-NAME | (ARG-NAME TYPE)
+  REST-ARG ::= ARG-NAME
+
+If you have old code using the old syntax, import
+(oop goops old-define-method) before (oop goops) as in:
+
+  (use-modules (oop goops old-define-method) (oop goops))
 
 * Changes to the gh_ interface
 
 * Changes to the scm_ interface
 
+** New function: scm_c_read (SCM port, void *buffer, scm_sizet size)
+
+Used by an application to read arbitrary number of bytes from a port.
+Same semantics as libc read, except that scm_c_read only returns less
+than SIZE bytes if at end-of-file.
+
+Warning: Doesn't update port line and column counts!
+
+** New function: scm_c_write (SCM port, const void *ptr, scm_sizet size)
+
+Used by an application to write arbitrary number of bytes to an SCM
+port.  Similar semantics as libc write.  However, unlike libc
+write, scm_c_write writes the requested number of bytes and has no
+return value.
+
+Warning: Doesn't update port line and column counts!
+
 ** New function: scm_init_guile ()
 
 In contrast to scm_boot_guile, scm_init_guile will return normally
@@ -276,6 +503,16 @@ behaviour is undefined - it may even crash or loop endlessly.  Further, for
 the case that the object is not found in the list, scm_c_memq returns #f which
 is similar to scm_memq, but different from scm_sloppy_memq's behaviour.
 
+** New functions: scm_remember_upto_here_1, scm_remember_upto_here_2, 
+scm_remember_upto_here
+
+These functions replace the function scm_remember.
+
+** Deprecated function:  scm_remember
+
+Use one of the new functions scm_remember_upto_here_1,
+scm_remember_upto_here_2 or scm_remember_upto_here instead.
+
 ** New global variable scm_gc_running_p introduced.
 
 Use this variable to find out if garbage collection is being executed.  Up to
@@ -320,6 +557,10 @@ Use these instead of SCM_SETCHARS.
 
 Use instead of SCM_COERCE_SUBSTR.
 
+** New macros:  SCM_DIR_OPEN_P, SCM_DIR_FLAG_OPEN
+
+For directory objects, use these instead of SCM_OPDIRP and SCM_OPN.
+
 ** Deprecated macros:  SCM_OUTOFRANGE, SCM_NALLOC, SCM_HUP_SIGNAL, 
 SCM_INT_SIGNAL, SCM_FPE_SIGNAL, SCM_BUS_SIGNAL, SCM_SEGV_SIGNAL, 
 SCM_ALRM_SIGNAL, SCM_GC_SIGNAL, SCM_TICK_SIGNAL, SCM_SIG_ORD, 
@@ -331,7 +572,7 @@ SCM_SUBSTRP, SCM_SUBSTR_STR, SCM_SUBSTR_OFFSET, SCM_COERCE_SUBSTR,
 SCM_ROSTRINGP, SCM_RWSTRINGP, SCM_VALIDATE_RWSTRING, SCM_ROCHARS,
 SCM_ROUCHARS, SCM_SETLENGTH, SCM_SETCHARS, SCM_LENGTH_MAX, SCM_GC8MARKP,
 SCM_SETGC8MARK, SCM_CLRGC8MARK, SCM_GCTYP16, SCM_GCCDR, SCM_SUBR_DOC,
-SCM_SUBR_PROPS
+SCM_OPDIRP, SCM_VALIDATE_OPDIR, SCM_WTA, RETURN_SCM_WTA, SCM_CONST_LONG
 
 Use SCM_ASSERT_RANGE or SCM_VALIDATE_XXX_RANGE instead of SCM_OUTOFRANGE.
 Use scm_memory_error instead of SCM_NALLOC.
@@ -355,6 +596,10 @@ Use SCM_SETGCMARK instead of SCM_SETGC8MARK.
 Use SCM_CLRGCMARK instead of SCM_CLRGC8MARK.
 Use SCM_TYP16 instead of SCM_GCTYP16.
 Use SCM_CDR instead of SCM_GCCDR.
+Use SCM_DIR_OPEN_P instead of SCM_OPDIRP.
+Use SCM_MISC_ERROR or SCM_WRONG_TYPE_ARG instead of SCM_WTA.
+Use SCM_MISC_ERROR or SCM_WRONG_TYPE_ARG instead of RETURN_SCM_WTA.
+Use SCM_VCELL_INIT instead of SCM_CONST_LONG.
 
 ** Removed function:  scm_struct_init
 
@@ -397,6 +642,10 @@ Use scm_make_smob_type and scm_set_smob_XXX instead.
 
 This can be used to set an apply function to a smob type.
 
+** Deprecated function:  scm_strprint_obj
+
+Use scm_object_to_string instead.
+
 \f
 Changes since Guile 1.3.4:
 
@@ -487,6 +736,10 @@ space" for Guile headers.  This means that the compiler only is given
 Implements the interface to documentation strings associated with
 objects.
 
+** New module (ice-9 time)
+
+Provides a macro `time', which displays execution time of a given form.
+
 * Changes to the stand-alone interpreter
 
 ** New command line option --debug