* Changes to the distribution
-** As per RELEASE directions, deprecated items have been removed
+** Guile now uses a versioning scheme similar to that of the Linux kernel.
-*** Macros removed
+Guile now always uses three numbers to represent the version,
+i.e. "1.6.5". The first number, 1, is the major version number, the
+second number, 6, is the minor version number, and the third number,
+5, is the micro version number. Changes in major version number
+indicate major changes in Guile.
- SCM_INPORTP, SCM_OUTPORTP SCM_ICHRP, SCM_ICHR, SCM_MAKICHR
- SCM_SETJMPBUF SCM_NSTRINGP SCM_NRWSTRINGP SCM_NVECTORP SCM_DOUBLE_CELLP
+Minor version numbers that are even denote stable releases, and odd
+minor version numbers denote development versions (which may be
+unstable). The micro version number indicates a minor sub-revision of
+a given MAJOR.MINOR release.
-*** C Functions removed
+In keeping with the new scheme, (minor-version) and scm_minor_version
+no longer return everything but the major version number. They now
+just return the minor version number. Two new functions
+(micro-version) and scm_micro_version have been added to report the
+micro version number.
- scm_sysmissing scm_tag scm_tc16_flo scm_tc_flo
- scm_fseek - replaced by scm_seek.
- gc-thunk - replaced by after-gc-hook.
- gh_int2scmb - replaced by gh_bool2scm.
- scm_tc_dblr - replaced by scm_tc16_real.
- scm_tc_dblc - replaced by scm_tc16_complex.
- scm_list_star - replaced by scm_cons_star.
+In addition, ./GUILE-VERSION now defines GUILE_MICRO_VERSION.
-*** scheme functions removed:
+** Guile now actively warns about deprecated features.
- tag - no replacement.
- fseek - replaced by seek.
- list* - replaced by cons*.
+The new configure option `--enable-deprecated=LEVEL' and the
+environment variable GUILE_WARN_DEPRECATED control this mechanism.
+See INSTALL and README for more information.
** New SRFI modules have been added:
SRFI-0 `cond-expand' is now supported in Guile, without requiring
using a module.
+(srfi srfi-1) is a library containing many useful pair- and list-processing
+ procedures.
+
(srfi srfi-2) exports and-let*.
(srfi srfi-6) is a dummy module for now, since guile already provides
doc-snarf
generate-autoload
punify
+ read-scheme-source
use2dot
See README there for more info.
(oop goops composite-slot)
The Guile Object Oriented Programming System (GOOPS) has been
-integrated into Guile.
-
-Type
-
- (use-modules (oop goops))
-
-access GOOPS bindings.
-
-We're now ready to try some basic GOOPS functionality.
-
-Generic functions
-
- (define-method (+ (x <string>) (y <string>))
- (string-append x y))
-
- (+ 1 2) --> 3
- (+ "abc" "de") --> "abcde"
-
-User-defined types
-
- (define-class <2D-vector> ()
- (x #:init-value 0 #:accessor x-component #:init-keyword #:x)
- (y #:init-value 0 #:accessor y-component #:init-keyword #:y))
-
- (define-method write ((obj <2D-vector>) port)
- (display (format #f "<~S, ~S>" (x-component obj) (y-component obj))
- port))
-
- (define v (make <2D-vector> #:x 3 #:y 4))
- v --> <3, 4>
-
- (define-method + ((x <2D-vector>) (y <2D-vector>))
- (make <2D-vector>
- #:x (+ (x-component x) (x-component y))
- #:y (+ (y-component x) (y-component y))))
-
- (+ v v) --> <6, 8>
-
-Asking for the type of an object
-
- (class-of v) --> #<<class> <2D-vector> 40241ac0>
- <2D-vector> --> #<<class> <2D-vector> 40241ac0>
- (class-of 1) --> #<<class> <integer> 401b2a98>
- <integer> --> #<<class> <integer> 401b2a98>
-
- (is-a? v <2D-vector>) --> #t
-
-See further in the GOOPS manual and tutorial in the `doc' directory,
-in info (goops.info) and texinfo formats.
+integrated into Guile. For further information, consult the GOOPS
+manual and tutorial in the `doc' directory.
** New module (ice-9 rdelim).
** New module (ice-9 rw)
This is a subset of the (scsh rw) module from guile-scsh. Currently
-it defines a single procedure:
-
-** 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.
+it defines two single procedures:
- * read any characters that are currently available, without
- waiting for the rest (short reads are possible).
+*** New function: read-string!/partial str [port_or_fdes [start [end]]]
- * wait for as long as it needs to for the first character to
- become available, unless the port is in non-blocking mode
+ Read characters from a port or file descriptor into a string STR.
+ A port must have an underlying file descriptor -- a so-called
+ fport. This procedure is scsh-compatible and can efficiently read
+ large strings.
- * return `#f' if end-of-file is encountered before reading any
- characters, otherwise return the number of characters read.
+*** New function: write-string/partial str [port_or_fdes [start [end]]]
- * 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
+ Write characters from a string STR to a port or file descriptor.
+ A port must have an underlying file descriptor -- a so-called
+ fport. This procedure is mostly compatible and can efficiently
+ write large strings.
** 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)
+This module includes Andrew K. Wright's pattern matcher. See
+ice-9/match.scm for brief description or
-See ice-9/match.scm for brief description or
-http://www.star-lab.com/wright/code.html for complete documentation.
+ http://www.star-lab.com/wright/code.html
-This module requires SLIB to be installed and available from Guile.
+for complete documentation.
** New module (ice-9 buffered-input)
See the README file in the `doc' directory for more details.
+** There are a couple of examples in the examples/ directory now.
+
* Changes to the stand-alone interpreter
-** Evaluation of "()", the empty list, is now an error.
+** New command line option `--use-srfi'
+
+Using this option, SRFI modules can be loaded on startup and be
+available right from the beginning. This makes programming portable
+Scheme programs easier.
-Previously, you could for example write (cons 1 ()); now you need to
-be more explicit and write (cons 1 '()).
+The option `--use-srfi' expects a comma-separated list of numbers,
+each representing a SRFI number to be loaded into the interpreter
+before starting evaluating a script file or the REPL. Additionally,
+the feature identifier for the loaded SRFIs is recognized by
+`cond-expand' when using this option.
+
+Example:
+$ guile --use-srfi=8,13
+guile> (receive (x z) (values 1 2) (+ 1 2))
+3
+guile> (string-pad "bla" 20)
+" bla"
+
+** Guile now always starts up in the `(guile-user)' module.
+
+Previously, scripts executed via the `-s' option would run in the
+`(guile)' module and the repl would run in the `(guile-user)' module.
+Now every user action takes place in the `(guile-user)' module by
+default.
+
+* Changes to Scheme functions and syntax
+
+** Previously deprecated Scheme functions have been removed:
+
+ tag - no replacement.
+ fseek - replaced by seek.
+ list* - replaced by cons*.
** It's now possible to create modules with controlled environments
(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.
+** Evaluation of "()", the empty list, is now an error.
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: "'()".
+** New concept of `Guile Extensions'.
+
+A Guile Extension is just a ordinary shared library that can be linked
+at run-time. We found it advantageous to give this simple concept a
+dedicated name to distinguish the issues related to shared libraries
+from the issues related to the module system.
+
+*** New function: load-extension
+
+Executing (load-extension lib init) is mostly equivalent to
+
+ (dynamic-call init (dynamic-link lib))
+
+except when scm_register_extension has been called previously.
+Whenever appropriate, you should use `load-extension' instead of
+dynamic-link and dynamic-call.
+
+*** New C function: scm_c_register_extension
+
+This function registers a initialization function for use by
+`load-extension'. Use it when you don't want specific extensions to
+be loaded as shared libraries (for example on platforms that don't
+support dynamic linking).
+
** Auto-loading of compiled-code modules is deprecated.
Guile used to be able to automatically find and link a shared
"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.
+This has been found to be too tricky, and is no longer supported. The
+shared libraries are now called "extensions". You should now write a
+small Scheme file that calls `load-extension' to load the shared
+library and initialize it explicitely.
The shared libraries themselves should be installed in the usual
places for shared libraries, with names like "libguile-foo-bar".
(define-module (foo bar))
- (dynamic-call "foobar_init" (dynamic-link "libguile-foo-bar"))
+ (load-extension "libguile-foo-bar" "foobar_init")
+
+** Backward incompatible change: eval EXP ENVIRONMENT-SPECIFIER
+
+`eval' is now R5RS, that is it takes two arguments.
+The second argument is an environment specifier, i.e. either
-The file name passed to `dynamic-link' should not contain an
-extension. It will be provided automatically.
+ (scheme-report-environment 5)
+ (null-environment 5)
+ (interaction-environment)
+
+or
+
+ any module.
** 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'.
+The function `eval' will 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
+A consequence of this change is that `eval' is not particularly
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
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',
+To prevent strange behavior, 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.
+Also, `export' will no longer silently re-export bindings imported
+from a used module. It will emit a `deprecation' warning and will
+cease to perform any re-export in the next version. If you actually
+want to re-export bindings, use the new `re-export' in place of
+`export'. The new `re-export' will not make copies of variables when
+rexporting them, as `export' did wrongly.
+
** The semantics of guardians have changed.
The changes are for the most part compatible. An important criterion
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.
+** Continuations created by call-with-current-continuation now accept
+any number of arguments, as required by R5RS.
** New function `issue-deprecation-warning'
-This function is used to displaying the deprecation messages that are
+This function is used to display the deprecation messages that are
controlled by GUILE_WARN_DEPRECATION as explained in the README.
(define (id x)
The old reader syntax `#&' is still supported, but deprecated. It
will be removed in the next release.
-** Backward incompatible change: eval EXP ENVIRONMENT-SPECIFIER
-
-`eval' is now R5RS, that is it takes two arguments.
-The second argument is an environment specifier, i.e. either
-
- (scheme-report-environment 5)
- (null-environment 5)
- (interaction-environment)
-
-or
-
- any module.
-
** New define-module option: pure
Tells the module system not to include any bindings from the root
Example:
-(define-module (foo)
- :pure
- :use-module (ice-9 r5rs)
- :export (bar))
-
-;;; Note that we're pure R5RS below this point!
+ (define-module (foo)
+ :pure
+ :use-module (ice-9 r5rs)
+ :export (bar))
-(define (bar)
- ...)
+ ;;; Note that we're pure R5RS below this point!
-** Deprecated: scm_make_shared_substring
-
-Explicit shared substrings will disappear from Guile.
-
-Instead, "normal" strings will be implemented using sharing
-internally, combined with a copy-on-write strategy.
-
-** Deprecated: scm_read_only_string_p
-
-The concept of read-only strings will disappear in next release of
-Guile.
-
-** Deprecated: scm_sloppy_memq, scm_sloppy_memv, scm_sloppy_member
-
-Instead, use scm_c_memq or scm_memq, scm_memv, scm_member.
+ (define (bar)
+ ...)
** New function: object->string OBJ
** New function: port-for-each proc
- Apply PROC to each port in the Guile port table in turn. The
- return value is unspecified. More specifically, PROC is applied
- exactly once to every port that exists in the system at the time
- PORT-FOR-EACH is invoked. Changes to the port table while
- PORT-FOR-EACH is running have no effect as far as PORT-FOR-EACH is
- concerned.
+Apply PROC to each port in the Guile port table in turn. The return
+value is unspecified. More specifically, PROC is applied exactly once
+to every port that exists in the system at the time PORT-FOR-EACH is
+invoked. Changes to the port table while PORT-FOR-EACH is running
+have no effect as far as PORT-FOR-EACH is concerned.
** New function: dup2 oldfd newfd
** New function: inet-pton family address
- Convert a printable string network address into an integer. Note
- that unlike the C version of this function, the result is an
- integer with normal host byte ordering. FAMILY can be `AF_INET'
- or `AF_INET6'. e.g.,
- (inet-pton AF_INET "127.0.0.1") => 2130706433
- (inet-pton AF_INET6 "::1") => 1
+Convert a printable string network address into an integer. Note that
+unlike the C version of this function, the result is an integer with
+normal host byte ordering. FAMILY can be `AF_INET' or `AF_INET6'.
+e.g.,
+
+ (inet-pton AF_INET "127.0.0.1") => 2130706433
+ (inet-pton AF_INET6 "::1") => 1
** New function: inet-ntop family address
- Convert an integer network address into a printable string. Note
- that unlike the C version of this function, the input is an
- integer with normal host byte ordering. FAMILY can be `AF_INET'
- or `AF_INET6'. e.g.,
- (inet-ntop AF_INET 2130706433) => "127.0.0.1"
- (inet-ntop AF_INET6 (- (expt 2 128) 1)) =>
+Convert an integer network address into a printable string. Note that
+unlike the C version of this function, the input is an integer with
+normal host byte ordering. FAMILY can be `AF_INET' or `AF_INET6'.
+e.g.,
+
+ (inet-ntop AF_INET 2130706433) => "127.0.0.1"
+ (inet-ntop AF_INET6 (- (expt 2 128) 1)) =>
ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
** Deprecated: id
** Deprecated: return-it
-Use `noop' instead.
+Do without it.
** Deprecated: string-character-length
There is no longer a distinction between builtin or other variables.
Use module system operations for all variables.
-* Changes to the gh_ interface
+** Lazy-catch handlers are no longer allowed to return.
-* Changes to the scm_ interface
+That is, a call to `throw', `error', etc is now guaranteed to not
+return.
+
+* Changes to the C interface
+
+** Types have been renamed from scm_*_t to scm_t_*.
+
+This has been done for POSIX sake. It reserves identifiers ending
+with "_t". What a concept.
+
+The old names are still available with status `deprecated'.
+
+** scm_t_bits (former scm_bits_t) is now a unsigned type.
+
+** Deprecated features have been removed.
+
+*** Macros removed
+
+ SCM_INPORTP, SCM_OUTPORTP SCM_ICHRP, SCM_ICHR, SCM_MAKICHR
+ SCM_SETJMPBUF SCM_NSTRINGP SCM_NRWSTRINGP SCM_NVECTORP SCM_DOUBLE_CELLP
+
+*** C Functions removed
+
+ scm_sysmissing scm_tag scm_tc16_flo scm_tc_flo
+ scm_fseek - replaced by scm_seek.
+ gc-thunk - replaced by after-gc-hook.
+ gh_int2scmb - replaced by gh_bool2scm.
+ scm_tc_dblr - replaced by scm_tc16_real.
+ scm_tc_dblc - replaced by scm_tc16_complex.
+ scm_list_star - replaced by scm_cons_star.
+
+** Deprecated: scm_makfromstr
+
+Use scm_mem2string instead.
+
+** Deprecated: scm_make_shared_substring
+
+Explicit shared substrings will disappear from Guile.
+
+Instead, "normal" strings will be implemented using sharing
+internally, combined with a copy-on-write strategy.
+
+** Deprecated: scm_read_only_string_p
+
+The concept of read-only strings will disappear in next release of
+Guile.
+
+** Deprecated: scm_sloppy_memq, scm_sloppy_memv, scm_sloppy_member
+
+Instead, use scm_c_memq or scm_memq, scm_memv, scm_member.
+
+** 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);
+
+** 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);
** New function: scm_c_read (SCM port, void *buffer, scm_sizet size)
scm_gensym now only takes one argument.
-** New function: scm_gentemp (SCM prefix, SCM obarray)
-
-The builtin `gentemp' has now become a primitive.
-
** Deprecated type tags: scm_tc7_ssymbol, scm_tc7_msymbol, scm_tcs_symbols,
scm_tc7_lvector
These functions work with variables instead of with vcells.
+** New functions for creating and defining `subr's and `gsubr's.
+
+The new functions more clearly distinguish between creating a subr (or
+gsubr) object and adding it to the current module.
+
+These new functions are available: scm_c_make_subr, scm_c_define_subr,
+scm_c_make_subr_with_generic, scm_c_define_subr_with_generic,
+scm_c_make_gsubr, scm_c_define_gsubr, scm_c_make_gsubr_with_generic,
+scm_c_define_gsubr_with_generic.
+
+** Deprecated functions: scm_make_subr, scm_make_subr_opt,
+ scm_make_subr_with_generic, scm_make_gsubr,
+ scm_make_gsubr_with_generic.
+
+Use the new ones from above instead.
+
+** C interface to the module system has changed.
+
+While we suggest that you avoid as many explicit module system
+operations from C as possible for the time being, the C interface has
+been made more similar to the high-level Scheme module system.
+
+*** New functions: scm_c_define_module, scm_c_use_module,
+ scm_c_export, scm_c_resolve_module.
+
+They mostly work like their Scheme namesakes. scm_c_define_module
+takes a function that is called a context where the new module is
+current.
+
+*** Deprecated functions: scm_the_root_module, scm_make_module,
+ scm_ensure_user_module, scm_load_scheme_module.
+
+Use the new functions instead.
+
+** Renamed function: scm_internal_with_fluids becomes
+ scm_c_with_fluids.
+
+scm_internal_with_fluids is available as a deprecated function.
+
+** New function: scm_c_with_fluid.
+
+Just like scm_c_with_fluids, but takes one fluid and one value instead
+of lists of same.
+
+** Deprecated typedefs: long_long, ulong_long.
+
+They are of questionable utility and they pollute the global
+namespace.
+
+** Deprecated typedef: scm_sizet
+
+It is of questionable utility now that Guile requires ANSI C, and is
+oddly named.
+
+** Deprecated typedefs: scm_port_rw_active, scm_port,
+ scm_ptob_descriptor, scm_debug_info, scm_debug_frame, scm_fport,
+ scm_option, scm_rstate, scm_rng, scm_array, scm_array_dim.
+
+Made more compliant with the naming policy by adding a _t at the end.
+
+** Deprecated functions: scm_mkbig, scm_big2num, scm_adjbig,
+ scm_normbig, scm_copybig, scm_2ulong2big, scm_dbl2big, scm_big2dbl
+
+With the exception of the misterious scm_2ulong2big, they are still
+available under new names (scm_i_mkbig etc). These functions are not
+intended to be used in user code. You should avoid dealing with
+bignums directly, and should deal with numbers in general (which can
+be bignums).
+
+** New functions: scm_short2num, scm_ushort2num, scm_int2num,
+ scm_uint2num, scm_size2num, scm_ptrdiff2num, scm_num2short,
+ scm_num2ushort, scm_num2int, scm_num2uint, scm_num2ptrdiff,
+ scm_num2size.
+
+These are conversion functions between the various ANSI C integral
+types and Scheme numbers.
+
+** New number validation macros:
+ SCM_NUM2{SIZE,PTRDIFF,SHORT,USHORT,INT,UINT}[_DEF]
+
+See above.
+
+** New functions: scm_gc_protect_object, scm_gc_unprotect_object
+
+These are just nicer-named old scm_protect_object and
+scm_unprotect_object.
+
+** Deprecated functions: scm_protect_object, scm_unprotect_object
+
+** New functions: scm_gc_[un]register_root, scm_gc_[un]register_roots
+
+These functions can be used to register pointers to locations that
+hold SCM values.
+
+** Deprecated function: scm_create_hook.
+
+Its sins are: misleading name, non-modularity and lack of general
+usefulness.
+
\f
Changes since Guile 1.3.4:
Usage: (help NAME) gives documentation about objects named NAME (a symbol)
(help REGEXP) ditto for objects with names matching REGEXP (a string)
+ (help 'NAME) gives documentation for NAME, even if it is not an object
(help ,EXPR) gives documentation for object returned by EXPR
(help (my module)) gives module commentary for `(my module)'
(help) gives this text