Guile NEWS --- history of user-visible changes.
-Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
See the end for copying conditions.
Please send Guile bug reports to bug-guile@gnu.org.
** Guile is now licensed with the GNU Lesser General Public License.
+** The manual is now licensed with the GNU Free Documentation License.
+
** Guile now requires GNU MP (http://swox.com/gmp).
Guile now uses the GNU MP library for arbitrary precision arithmetic.
that they can install to that won't be changed out from under them
with each micro release during a stable series.
-** There are two new thread implementation options: "null" and "coop-pthreads".
+** Thread implementation has changed.
When you configure "--with-threads=null", you will get the usual
threading API (call-with-new-thread, make-mutex, etc), but you can't
is always present, although you might not be able to create new
threads.
-The "coop-pthread" (or shorter: "copt") thread implementation will use
-portable POSIX threads but will restrict them so that only one thread
-can execute 'in Guile' at any one time. This option will give you the
-same basic behavior as the old "coop" option, but hopefully in a more
-portable way.
+When you configure "--with-threads=pthreads" or "--with-threads=yes",
+you will get threads that are implemented with the portable POSIX
+threads. These threads can run concurrently (unlike the previous
+"coop" thread implementation), but need to cooperate for things like
+the GC. See the manual for details. [XXX - write this.]
-The default is now "coop-pthread", unless your platform doesn't have
-pthreads, in which case "null" threads are used.
+The default is "pthreads", unless your platform doesn't have pthreads,
+in which case "null" threads are used.
** New module (ice-9 serialize):
C code primitive), enabling the computations to run in parallel
while the scripting code runs single-threadedly.
+** New module (srfi srfi-26)
+
+This is an implementation of SRFI-26.
+
** Guile now includes its own version of libltdl.
We now use a modified version of libltdl that allows us to make
improvements to it without having to rely on libtool releases.
-* Changes to the standalone interpreter
+* Changes to the stand-alone interpreter
** New command line option `--no-debug'.
Previously, the normal evaluator would have been used. Using the
debugging evaluator gives better error messages.
+** The '-e' option now 'read's its argument.
+
+This is to allow the new '(@ MODULE-NAME VARIABLE-NAME)' construct to
+be used with '-e'. For example, you can now write a script like
+
+ #! /bin/sh
+ exec guile -e '(@ (demo) main)' -s "$0" "$@"
+ !#
+
+ (define-module (demo)
+ :export (main))
+
+ (define (main args)
+ (format #t "Demo: ~a~%" args))
+
+
* Changes to Scheme functions and syntax
+** New syntax '@' and '@@':
+
+You can now directly refer to variables exported from a module by
+writing
+
+ (@ MODULE-NAME VARIABLE-NAME)
+
+For example (@ (ice-9 pretty-print) pretty-print) will directly access
+the pretty-print variable exported from the (ice-9 pretty-print)
+module. You don't need to 'use' that module first. You can also use
+'@' with 'set!'.
+
+The related syntax (@@ MODULE-NAME VARIABLE-NAME) works just like '@',
+but it can also access variables that have not been exported. It is
+intended only for kluges and temporary fixes and for debugging, not
+for ordinary code.
+
+** 'while' now provides 'break' and 'continue'
+
+break and continue were previously bound in a while loop, but not
+documented, and continue didn't quite work properly. The undocumented
+parameter to break which gave a return value for the while has been
+dropped.
+
** 'call-with-current-continuation' is now also available under the name
'call/cc'.
version string without the final micro-version number. See "Changes
to the distribution" above.
-** Futures
-
-Futures is a way of providing an alternative evaluation policy, very
-similar in principle to "promises". Like promises, futures allow the
-main process to continue instantly, but while promises postpone
-evaluation ("lazy" evaluation) until the value is requested, futures
-immediately starts evaluation in a parallel thread.
-
-Futures are good when you want to express that "I'll need the value of
-this computation sometime soon" and want to allow processing to go on
-in the background until that time arrives.
-
-** New syntax: future FORM
-
-Begin evaluation of FORM in a parallel thread and return the future
-immediately. (Akin to 'delay'.)
-
-** New procedure: future-ref FUTURE
-
-Return the computed value of the future. Wait if the computation is
-not finished. (Akin to 'force'.)
-
-** New syntax: parallel FORM ...
-
-Compute the results of FORM ... in parallel (in a separate thread for
-each form) and return them as multiple values.
-
-** New syntax: letpar ((VAR EXP) ...) BODYFORM ...
-
-Like 'let' but evaluates the binding expressions EXP ... in parallel.
+** Futures: future, make-future, future-ref
-** New functions: par-map, par-for-each PROC ARGLIST ...
+Futures are like promises, but begun immediately in a new thread. See
+the "Futures" section in the reference manual.
-Like 'map' and 'for-each' but evaluate the procedure PROC in a
-separate thread for each (set of) argument(s). All applications are
-guaranteed to be completed before the procedure returns.
+** New threading functions: parallel, letpar, par-map, and friends
-** New functions: n-par-map, n-par-for-each N PROC ARGLIST ...
-
-Like 'par-map' and 'par-for-each' but evaluate the procedure PROC in N
-threads. This is useful when PROC uses large amounts of resources
-and/or the argument list(s) is/are long so that one thread per (set
-of) argument(s) would consume too much system resources. On a
-dual-CPU system, N = 4 would often be a good choice.
-
-** New function: n-for-each-par-map N S-PROC P-PROC ARGLIST ...
-
-Using N parallel processes, apply S-PROC in serial order to each
-result of applying P-PROC to each set of arguments in the argument
-lists ARGLIST ...
-
-Like a composition of 'for-each' and 'n-par-map', but allows S-PROC to
-start processing while the results of P-PROC are being produced.
+These are convenient ways to run calculations in parallel in new
+threads. See "Parallel forms" in the manual for details.
** Fair mutexes and condition variables
(eqv? 0.0 (- 0.0))
=> #f
+** Guile now has exact rationals.
+
+Guile can now represent fractions such as 1/3 exactly. Computing with
+them is also done exactly, of course:
+
+ (* 1/3 3/2)
+ => 1/2
+
+** 'floor', 'ceiling', 'round' and 'truncate' now return exact numbers
+ for exact arguments.
+
+For example: (floor 2) now returns an exact 2 where in the past it
+returned an inexact 2.0. Likewise, (floor 5/4) returns an exact 1.
+
+** inexact->exact no longer returns only integers.
+
+Without exact rationals, the closest exact number was always an
+integer, but now inexact->exact returns the fraction that is exactly
+equal to a floating point number. For example:
+
+ (inexact->exact 1.234)
+ => 694680242521899/562949953421312
+
+When you want the old behavior, use 'round' explicitely:
+
+ (inexact->exact (round 1.234))
+ => 1
+
+** New function 'rationalize'.
+
+This function finds a simple fraction that is close to a given real
+number. For example (and compare with inexact->exact above):
+
+ (rationalize (inexact->exact 1.234) 1/2000)
+ => 58/47
+
+Note that, as required by R5RS, rationalize returns only then an exact
+result when both its arguments are exact.
+
+** 'odd?' and 'even?' work also for inexact integers.
+
+Previously, (odd? 1.0) would signal an error since only exact integers
+were recognized as integers. Now (odd? 1.0) returns #t, (odd? 2.0)
+returns #f and (odd? 1.5) signals an error.
+
** We now have uninterned symbols.
The new function 'make-symbol' will return a uninterned symbol. This
The function pretty-print from the (ice-9 pretty-print) module can now
also be invoked with keyword arguments that control things like
-maximum output width. See its online documentation.
+maximum output width. See the manual for details.
** Variables have no longer a special behavior for `equal?'.
There is no replacement for undefine.
-** SRFI-1 delete equality argument order fixed.
+** call-with-output-string doesn't segv on closed port
+
+Previously call-with-output-string would give a segmentation fault if
+the string port was closed by the called function. An exception is
+raised now.
+
+** (ice-9 popen) duplicate pipe fd fix
+
+open-pipe, open-input-pipe and open-output-pipe left an extra copy of
+their pipe file descriptor in the child, which was normally harmless,
+but it can prevent the parent seeing eof or a broken pipe immediately
+and has now been fixed.
+
+** source-properties and set-source-properties! fix
+
+Properties set with set-source-properties! can now be read back
+correctly with source-properties.
+
+** SRFI-1 fixes
-In the srfi-1 module delete and delete!, the order of the arguments to
-the "=" procedure now matches the SRFI-1 specification.
+delete and delete! now call the "=" procedure with arguments in the
+order described by the SRFI-1 specification
+
+list-copy now accepts improper lists, per the specification.
+
+** SRFI-19 fixes
+
+date-week-number now correctly respects the requested day of week
+starting the week.
* Changes to the C interface
+** New way to deal with non-local exits and reentries.
+
+There is a new set of functions that essentially do what
+scm_internal_dynamic_wind does, but in a way that is more convenient
+for C code in some situations. Here is a quick example of how to
+prevent a potential memory leak:
+
+ void
+ foo ()
+ {
+ char *mem;
+
+ scm_frame_begin (0);
+
+ mem = scm_malloc (100);
+ scm_frame_unwind_handler (free, mem, SCM_F_WIND_EXPLICITELY);
+
+ /* MEM would leak if BAR throws an error.
+ SCM_FRAME_UNWIND_HANDLER frees it nevertheless. */
+
+ bar ();
+
+ scm_frame_end ();
+
+ /* Because of SCM_F_WIND_EXPLICITELY, MEM will be freed by
+ SCM_FRAME_END as well.
+ */
+ }
+
+For full documentation, see the node "Frames" in the manual.
+
+** New way to block and unblock asyncs
+
+In addition to scm_c_call_with_blocked_asyncs you can now also use
+scm_frame_block_asyncs in a 'frame' (see above). Likewise for
+scm_c_call_with_unblocked_asyncs and scm_frame_unblock_asyncs.
+
+** New way to temporarily set the current input, output or error ports
+
+C code can now use scm_frame_current_<foo>_port in a 'frame' (see
+above). <foo> is one of "input", "output" or "error".
+
+** New way to temporarily set fluids
+
+C code can now use scm_frame_fluid in a 'frame' (see
+above) to temporarily set the value of a fluid.
+
+** New types scm_t_intmax and scm_t_uintmax.
+
+On platforms that have them, these types are identical to intmax_t and
+uintmax_t, respectively. On other platforms, they are identical to
+the largest integer types that Guile knows about.
+
** Many public #defines with generic names have been made private.
#defines with generic names like HAVE_FOO or SIZEOF_FOO have been made
scm_t_int32
scm_t_uint32
-Guile always defines
+Guile always defines these to 0 or 1
SCM_HAVE_T_INT64
SCM_HAVE_T_UINT64
-and when either of these are defined to 1, optionally defines
+and when either of these are defined to 1, also defines
scm_t_int64
scm_t_uint64
scm_t_timespec
+** The macro SCM_IFLAGP now only returns true for flags
+
+User code should never have used this macro anyway. And, you should not use
+it in the future either. Thus, the following explanation is just for the
+impropable case that your code actually made use of this macro, and that you
+are willing to depend on internals which will probably change in the near
+future.
+
+Formerly, SCM_IFLAGP also returned true for evaluator bytecodes created with
+SCM_MAKSPCSYM (short instructions) and evaluator bytecodes created with
+SCM_MAKISYM (short instructions). Now, SCM_IFLAG only returns true for
+Guile's special constants created with SCM_MAKIFLAG. To achieve the old
+behaviour, instead of
+
+ SCM_IFLAGP(x)
+
+you would have to write
+
+ (SCM_ISYMP(x) || SCM_IFLAGP(x))
+
+** The macro SCM_TYP16S has been deprecated.
+
+This macro is not intended for public use. However, if you allocated types
+with tc16 type codes in a way that you would have needed this macro, you are
+expected to have a deep knowledge of Guile's type system. Thus, you should
+know how to replace this macro.
+
+** The macro SCM_SLOPPY_INEXACTP has been deprecated.
+
+Use SCM_INEXACTP instead.
+
+** The macro SCM_SLOPPY_REALP has been deprecated.
+
+Use SCM_REALP instead.
+
+** The macro SCM_SLOPPY_COMPLEXP has been deprecated.
+
+Use SCM_COMPLEXP instead.
+
** The preprocessor define USE_THREADS has been deprecated.
Going forward, assume that the thread API is always present.
These macros were used in the implementation of the evaluator. It's unlikely
that they have been used by user code.
+** Deprecated helper functions for evaluation and application:
+scm_m_expand_body, scm_macroexp
+
+These functions were used in the implementation of the evaluator. It's
+unlikely that they have been used by user code.
+
+** Deprecated functions for unmemoization: scm_unmemocar
+
+** Deprecated macros for iloc handling: SCM_ILOC00, SCM_IDINC, SCM_IDSTMSK
+
+These macros were used in the implementation of the evaluator. It's unlikely
+that they have been used by user code.
+
** Removed definitions: scm_lisp_nil, scm_lisp_t, s_nil_ify,
scm_m_nil_ify, s_t_ify, scm_m_t_ify, s_0_cond, scm_m_0_cond, s_0_ify,
scm_m_0_ify, s_1_ify, scm_m_1_ify, scm_debug_newcell,
scm_debug_newcell2, 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,
-*top-level-lookup-closure*, scm_top_level_lookup_closure_var,
+scm_top_level_lookup_closure_var, *top-level-lookup-closure*,
scm_system_transformer, scm_eval_3, scm_eval2,
root_module_lookup_closure, SCM_SLOPPY_STRINGP, SCM_RWSTRINGP,
-scm_read_only_string_p,
-scm_make_shared_substring,
-scm_tc7_substring, sym_huh, SCM_VARVCELL, SCM_UDVARIABLEP, SCM_DEFVARIABLEP,
-scm_mkbig, scm_big2inum,
-scm_adjbig, scm_normbig, scm_copybig, scm_2ulong2big, scm_dbl2big,
-scm_big2dbl, SCM_FIXNUM_BIT,
-SCM_SETCHARS,
+scm_read_only_string_p, scm_make_shared_substring, scm_tc7_substring,
+sym_huh, SCM_VARVCELL, SCM_UDVARIABLEP, SCM_DEFVARIABLEP, scm_mkbig,
+scm_big2inum, scm_adjbig, scm_normbig, scm_copybig, scm_2ulong2big,
+scm_dbl2big, scm_big2dbl, SCM_FIXNUM_BIT, SCM_SETCHARS,
SCM_SLOPPY_SUBSTRP, SCM_SUBSTR_STR, SCM_SUBSTR_OFFSET, SCM_LENGTH_MAX,
-SCM_SETLENGTH, SCM_ROSTRINGP, SCM_ROLENGTH, SCM_ROCHARS,
-SCM_ROUCHARS, SCM_SUBSTRP, SCM_COERCE_SUBSTR, scm_strhash,
-scm_sym2vcell, scm_sym2ovcell_soft, scm_sym2ovcell,
-scm_intern_obarray_soft, scm_intern_obarray, scm_intern, scm_intern0,
-scm_sysintern, scm_sysintern0, scm_sysintern0_no_module_lookup,
-scm_symbol_value0, scm_string_to_obarray_symbol, scm_intern_symbol,
-scm_unintern_symbol, scm_symbol_binding, scm_symbol_interned_p,
-scm_symbol_bound_p, scm_symbol_set_x, scm_gentemp,
-scm_init_symbols_deprecated, s_vector_set_length_x,
+SCM_SETLENGTH, SCM_ROSTRINGP, SCM_ROLENGTH, SCM_ROCHARS, SCM_ROUCHARS,
+SCM_SUBSTRP, SCM_COERCE_SUBSTR, scm_sym2vcell, scm_intern,
+scm_intern0, scm_sysintern, scm_sysintern0,
+scm_sysintern0_no_module_lookup, scm_init_symbols_deprecated,
scm_vector_set_length_x, scm_contregs, scm_debug_info,
-scm_debug_frame, SCM_DSIDEVAL, SCM_OPDIRP, scm_fport, scm_option,
-SCM_CONST_LONG, SCM_VCELL, SCM_GLOBAL_VCELL, SCM_VCELL_INIT,
-SCM_GLOBAL_VCELL_INIT, scm_srcprops, scm_srcprops_chunk,
-scm_info_frame, scm_stack, scm_array, scm_array_dim,
-SCM_ARRAY_CONTIGUOUS, SCM_HUGE_LENGTH, SCM_FUNC_NAME, SCM_WTA,
-RETURN_SCM_WTA, SCM_VALIDATE_NUMBER_COPY,
-SCM_VALIDATE_NUMBER_DEF_COPY, SCM_VALIDATE_STRINGORSUBSTR,
-SCM_VALIDATE_ROSTRING, SCM_VALIDATE_ROSTRING_COPY,
-SCM_VALIDATE_NULLORROSTRING_COPY, SCM_VALIDATE_RWSTRING,
-SCM_VALIDATE_OPDIR, DIGITS, scm_small_istr2int, scm_istr2int,
+scm_debug_frame, SCM_DSIDEVAL, SCM_CONST_LONG, SCM_VCELL,
+SCM_GLOBAL_VCELL, SCM_VCELL_INIT, SCM_GLOBAL_VCELL_INIT,
+SCM_HUGE_LENGTH, SCM_VALIDATE_STRINGORSUBSTR, SCM_VALIDATE_ROSTRING,
+SCM_VALIDATE_ROSTRING_COPY, SCM_VALIDATE_NULLORROSTRING_COPY,
+SCM_VALIDATE_RWSTRING, DIGITS, scm_small_istr2int, scm_istr2int,
scm_istr2flo, scm_istring2number, scm_istr2int, scm_istr2flo,
scm_istring2number, scm_vtable_index_vcell, scm_si_vcell, SCM_ECONSP,
SCM_NECONSP, SCM_GLOC_VAR, SCM_GLOC_VAL, SCM_GLOC_SET_VAL,
SCM_GLOC_VAL_LOC, scm_make_gloc, scm_gloc_p, scm_tc16_variable
+\f
Changes since Guile 1.4:
* Changes to the distribution
** New functions: scm_call_0, scm_call_1, scm_call_2, scm_call_3
-Call a procedure with the indicated number of arguments.
-
-Example:
-
- scm_call_1 (proc, arg1);
+Call a procedure with the indicated number of arguments. See "Fly
+Evaluation" in the manual.
** New functions: scm_apply_0, scm_apply_1, scm_apply_2, scm_apply_3
-Call a procedure with the indicated number of arguments and a list
-of arguments.
-
-Example:
-
- scm_apply_1 (proc, arg1, args);
+Call a procedure with the indicated number of arguments and a list of
+further arguments. See "Fly Evaluation" in the manual.
** New functions: scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5
-Create a list of the given number of elements.
+Create a list of the given number of elements. See "List
+Constructors" in the manual.
** Renamed function: scm_listify has been replaced by scm_list_n.