X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/14f1d9fec8091a5d29c3f2ac57b31c28825476cb..22a52da14dd86801cc3a36837601929effde1904:/NEWS diff --git a/NEWS b/NEWS index a4e93984a..5c5fae78e 100644 --- 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: @@ -82,11 +131,131 @@ Example: (use-modules (ice-9 safe)) (define m (make-safe-module)) ;;; m will now be a module containing only a safe subset of R5RS -(eval-in-module '(+ 1 2) m) --> 3 -(eval-in-module 'load m) --> ERROR: Unbound variable: load +(eval '(+ 1 2) m) --> 3 +(eval 'load m) --> ERROR: Unbound variable: load * Changes to Scheme functions and syntax +** The empty combination is no longer valid syntax. + +Previously, the expression "()" evaluated to the empty list. This has +been changed to signal a "missing expression" error. The correct way +to write the empty list as a literal constant is to use quote: "'()". + +** Auto-loading of compiled-code modules is deprecated. + +Guile used to be able to automatically find and link a shared +libraries to satisfy requests for a module. For example, the module +`(foo bar)' could be implemented by placing a shared library named +"foo/libbar.so" (or with a different extension) in a directory on the +load path of Guile. + +This has been found to be too tricky, and is no longer supported. +What you should do instead now is to write a small Scheme file that +explicitly calls `dynamic-link' to load the shared library and +`dynamic-call' to initialize it. + +The shared libraries themselves should be installed in the usual +places for shared libraries, with names like "libguile-foo-bar". + +For example, place this into a file "foo/bar.scm" + + (define-module (foo bar)) + + (dynamic-call "foobar_init" (dynamic-link "libguile-foo-bar")) + +The file name passed to `dynamic-link' should not contain an +extension. It will be provided automatically. + +** 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. + +** `port-for-each' makes an additional guarantee. + +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. + +This guarantee is important to make (ice-9 popen) work reliable. + +** 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. + ** New function `make-object-property' This function returns a new `procedure with setter' P that can be used @@ -167,17 +336,186 @@ Guile. ** Deprecated: scm_sloppy_memq, scm_sloppy_memv, scm_sloppy_member -Instead, use scm_memq, scm_memv, scm_member. +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 +return value is unspecified. + +** New function: dup2 oldfd newfd + +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. The return value is +unspecified. + +** New function: close-fdes fd + +A simple wrapper for the `close' system call. Close file +descriptor FD, which must be an integer. Unlike close (*note +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: mkstemp! tmpl +mkstemp creates a new unique file in the file system and returns a +new buffered port open for reading and writing to the file. TMPL +is a string specifying where the file should be created: it must +end with `XXXXXX' and will be changed in place to return the name +of the temporary file. + +** 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. + +** The (ice-9 popen) module now attempts to set up file descriptors in +the child process from the current Scheme ports, instead of using the +current values of file descriptors 0, 1, and 2 in the parent process. + +** Removed function: builtin-weak-bindings + +There is no such concept as a weak binding any more. + +** 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 after initializing Guile. It is not available on all systems, tho. +** New functions: scm_str2symbol, scm_mem2symbol + +The function scm_str2symbol takes a const char* pointing to a zero-terminated +field of characters and creates a scheme symbol object from that C string. +The function scm_mem2symbol takes a const char* and a number of characters and +creates a symbol from the characters in that memory area. + ** New functions: scm_primitive_make_property scm_primitive_property_ref scm_primitive_property_set_x @@ -193,6 +531,34 @@ amount of smob memory you free. The previous method, which involved calling scm_done_malloc with negative argument, was somewhat unintuitive (and is still available, of course). +** New function: scm_c_memq (SCM obj, SCM list) + +This function provides a fast C level alternative for scm_memq for the case +that the list parameter is known to be a proper list. The function is a +replacement for scm_sloppy_memq, but is stricter in its requirements on its +list input parameter, since for anything else but a proper list the function's +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 function: scm_allocate_string + +This function replaces the function scm_makstr. + +** Deprecated function: scm_makstr + +Use the new function scm_allocate_string instead. + ** New global variable scm_gc_running_p introduced. Use this variable to find out if garbage collection is being executed. Up to @@ -202,20 +568,95 @@ collector has set this variable. But, this is an implementation detail that may change. Further, scm_gc_heap_lock is not set throughout gc, thus the use of this variable is (and has been) not fully safe anyway. +** New macros: SCM_BITVECTOR_MAX_LENGTH, SCM_UVECTOR_MAX_LENGTH + +Use these instead of SCM_LENGTH_MAX. + +** New macros: SCM_CONTINUATION_LENGTH, SCM_CCLO_LENGTH, SCM_STACK_LENGTH, +SCM_STRING_LENGTH, SCM_SYMBOL_LENGTH, SCM_UVECTOR_LENGTH, +SCM_BITVECTOR_LENGTH, SCM_VECTOR_LENGTH. + +Use these instead of SCM_LENGTH. + +** New macros: SCM_SET_CONTINUATION_LENGTH, SCM_SET_STRING_LENGTH, +SCM_SET_SYMBOL_LENGTH, SCM_SET_VECTOR_LENGTH, SCM_SET_UVECTOR_LENGTH, +SCM_SET_BITVECTOR_LENGTH + +Use these instead of SCM_SETLENGTH + +** New macros: SCM_STRING_CHARS, SCM_SYMBOL_CHARS, SCM_CCLO_BASE, +SCM_VECTOR_BASE, SCM_UVECTOR_BASE, SCM_BITVECTOR_BASE, SCM_COMPLEX_MEM, +SCM_ARRAY_MEM + +Use these instead of SCM_CHARS, SCM_UCHARS, SCM_ROCHARS, SCM_ROUCHARS or +SCM_VELTS. + +** New macros: SCM_SET_BIGNUM_BASE, SCM_SET_STRING_CHARS, +SCM_SET_SYMBOL_CHARS, SCM_SET_UVECTOR_BASE, SCM_SET_BITVECTOR_BASE, +SCM_SET_VECTOR_BASE + +Use these instead of SCM_SETCHARS. + +** New macro: SCM_BITVECTOR_P + +** New macro: SCM_STRING_COERCE_0TERMINATION_X + +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, SCM_ORD_SIG, SCM_NUM_SIGS, SCM_SYMBOL_SLOTS, SCM_SLOTS, SCM_SLOPPY_STRINGP, -SCM_VALIDATE_STRINGORSUBSTR, SCM_FREEP, SCM_NFREEP +SCM_VALIDATE_STRINGORSUBSTR, SCM_FREEP, SCM_NFREEP, SCM_CHARS, SCM_UCHARS, +SCM_VALIDATE_ROSTRING, SCM_VALIDATE_ROSTRING_COPY, +SCM_VALIDATE_NULLORROSTRING_COPY, SCM_ROLENGTH, SCM_LENGTH, SCM_HUGE_LENGTH, +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_OPDIRP, SCM_VALIDATE_OPDIR, SCM_WTA, RETURN_SCM_WTA, SCM_CONST_LONG, +SCM_WNA, SCM_FUNC_NAME, SCM_VALIDATE_NUMBER_COPY, +SCM_VALIDATE_NUMBER_DEF_COPY Use SCM_ASSERT_RANGE or SCM_VALIDATE_XXX_RANGE instead of SCM_OUTOFRANGE. Use scm_memory_error instead of SCM_NALLOC. Use SCM_STRINGP instead of SCM_SLOPPY_STRINGP. Use SCM_VALIDATE_STRING instead of SCM_VALIDATE_STRINGORSUBSTR. Use SCM_FREE_CELL_P instead of SCM_FREEP/SCM_NFREEP +Use a type specific accessor macro instead of SCM_CHARS/SCM_UCHARS. +Use a type specific accessor instead of SCM(_|_RO|_HUGE_)LENGTH. +Use SCM_VALIDATE_(SYMBOL|STRING) instead of SCM_VALIDATE_ROSTRING. +Use SCM_STRING_COERCE_0TERMINATION_X instead of SCM_COERCE_SUBSTR. +Use SCM_STRINGP or SCM_SYMBOLP instead of SCM_ROSTRINGP. +Use SCM_STRINGP instead of SCM_RWSTRINGP. +Use SCM_VALIDATE_STRING instead of SCM_VALIDATE_RWSTRING. +Use SCM_STRING_CHARS instead of SCM_ROCHARS. +Use SCM_STRING_UCHARS instead of SCM_ROUCHARS. +Use a type specific setter macro instead of SCM_SETLENGTH. +Use a type specific setter macro instead of SCM_SETCHARS. +Use a type specific length macro instead of SCM_LENGTH_MAX. +Use SCM_GCMARKP instead of SCM_GC8MARKP. +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. +Use SCM_WRONG_NUM_ARGS instead of SCM_WNA. ** Removed function: scm_struct_init +** Removed variable: scm_symhash_dim + +** Renamed function: scm_make_cont has been replaced by +scm_make_continuation, which has a different interface. + ** Deprecated function: scm_call_catching_errors Use scm_catch or scm_lazy_catch from throw.[ch] instead. @@ -242,6 +683,23 @@ scm_tc7_lvector There is now only a single symbol type scm_tc7_symbol. The tag scm_tc7_lvector was not used anyway. +** Deprecated function: scm_make_smob_type_mfpe, scm_set_smob_mfpe. + +Use scm_make_smob_type and scm_set_smob_XXX instead. + +** New function scm_set_smob_apply. + +This can be used to set an apply function to a smob type. + +** Deprecated function: scm_strprint_obj + +Use scm_object_to_string instead. + +** Deprecated function: scm_wta + +Use scm_wrong_type_arg, or another appropriate error signalling function +instead. + Changes since Guile 1.3.4: @@ -332,6 +790,14 @@ 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. + +** New module (ice-9 history) + +Loading this module enables value history in the repl. + * Changes to the stand-alone interpreter ** New command line option --debug