From: Andy Wingo Date: Fri, 19 Jun 2009 09:19:34 +0000 (+0200) Subject: another draft of NEWS X-Git-Url: http://git.hcoop.net/bpt/guile.git/commitdiff_plain/96b73e84bbb6d88c73a99bf46450642d79612be0?hp=159399850de811f23e45d439aecf452b0137d847 another draft of NEWS * NEWS: Another draft. --- diff --git a/NEWS b/NEWS index 303caea93..141855591 100644 --- a/NEWS +++ b/NEWS @@ -5,7 +5,21 @@ See the end for copying conditions. Please send Guile bug reports to bug-guile@gnu.org. -Changes in 1.9.1 (changes since the 1.8.x series): +Changes in 1.9.0 (changes since the 1.8.x series): + +* New modules (see the manual for details) + +** `(srfi srfi-18)', more sophisticated multithreading support +** `(ice-9 i18n)', internationalization support +** `(rnrs bytevector)', the R6RS bytevector API +** `(system xref)', a cross-referencing facility (FIXME undocumented) + +* Changes to the stand-alone interpreter + +** Guile now can compile Scheme to bytecode for a custom virtual machine. + +Compiled code loads much faster than Scheme source code, and runs around +3 or 4 times as fast, generating much less garbage in the process. ** The stack limit is now initialized from the environment. @@ -13,11 +27,31 @@ If getrlimit(2) is available and a stack limit is set, Guile will set its stack limit to 80% of the rlimit. Otherwise the limit is 160000 words, a four-fold increase from the earlier default limit. -** Fix bad interaction between `false-if-exception' and stack-call. +** New environment variables: GUILE_LOAD_COMPILED_PATH, + GUILE_SYSTEM_LOAD_COMPILED_PATH -Exceptions thrown by `false-if-exception' were erronously causing the -stack to be saved, causing later errors to show the incorrectly-saved -backtrace. This has been fixed. +GUILE_LOAD_COMPILED_PATH is for compiled files what GUILE_LOAD_PATH is +for source files. It is a different path, however, because compiled +files are architecture-specific. GUILE_SYSTEM_LOAD_COMPILED_PATH is like +GUILE_SYSTEM_PATH. + +** New read-eval-print loop (REPL) implementation + +Running Guile with no arguments drops the user into the new REPL. While +it is self-documenting to an extent, the new REPL has not yet been +documented in the manual. This will be fixed before 2.0. + +** New `guile-tools' commands: `compile', `disassemble' + +Pass the --help command-line option to these commands for more +information. + +* Changes to Scheme functions and syntax + +** Procedure removed: `the-environment' + +This procedure was part of the interpreter's execution model, and does +not apply to the compiler. ** Files loaded with primitive-load-path will now be compiled automatically. @@ -38,30 +72,191 @@ ccache's behavior for C files. To inhibit autocompilation, set the GUILE_AUTO_COMPILE environment variable to 0, or pass --no-autocompile on the Guile command line. -** New environment variables: GUILE_LOAD_COMPILED_PATH, - GUILE_SYSTEM_LOAD_COMPILED_PATH +Note that there is currently a bug here: automatic compilation will +sometimes be attempted when it shouldn't. -GUILE_LOAD_COMPILED_PATH is for compiled files what GUILE_LOAD_PATH is -for source files. It is a different path, however, because compiled -files are architecture-specific. GUILE_SYSTEM_LOAD_COMPILED_PATH is like -GUILE_SYSTEM_PATH. +For example, the old (lang elisp) modules are meant to be interpreted, +not compiled. This bug will be fixed before 2.0. FIXME 2.0: Should say +something here about module-transformer called for compile. -** New global variables: %load-compiled-path, %load-compiled-extensions +** New POSIX procedures: `getrlimit' and `setrlimit' -These are analogous to %load-path and %load-extensions. +Note however that the interface of these functions is likely to change +in the next prerelease. -** New installation directory: $(pkglibdir)/1.9/ccache +** New procedure in `(oops goops)': `method-formals' -If $(libdir) is /usr/lib, for example, Guile will install its .go files -to /usr/lib/guile/1.9/ccache. These files are architecture-specific. +** BUG: (procedure-property func 'arity) does not work on compiled + procedures -** scm_primitive_load_path has additional argument, exception_on_error +This will be fixed one way or another before 2.0. -** scm_stat has additional argument, exception_on_error +** New procedures in (ice-9 session): `add-value-help-handler!', + `remove-value-help-handler!', `add-name-help-handler!' + `remove-name-help-handler!', `procedure-arguments', -** New entry into %guile-build-info: `ccachedir' +The value and name help handlers provide some minimal extensibility to +the help interface. Guile-lib's `(texinfo reflection)' uses them, for +example, to make stexinfo help documentation available. See those +procedures' docstrings for more information. + +`procedure-arguments' describes the arguments that a procedure can take, +combining arity and formals. For example: + + (procedure-arguments resolve-interface) + => ((required . (name)) (rest . args)) -Probably should be removed? +Additionally, `module-commentary' is now publically exported from +`(ice-9 session). + +** Deprecated: `procedure->memoizing-macro', `procedure->syntax' + +These procedures will not work with syncase expansion, and indeed are +not used in the normal course of Guile. They are still used by the old +Emacs Lisp support, however. + +** New language: ECMAScript + +Guile now ships with one other high-level language supported, +ECMAScript. The goal is to support all of version 3.1 of the standard, +but not all of the libraries are there yet. This support is not yet +documented; ask on the mailing list if you are interested. + +** Defmacros may now have docstrings. + +Indeed, any macro may have a docstring. `object-documentation' from +`(ice-9 documentation)' may be used to retrieve the docstring, once you +have a macro value -- but see the above note about first-class macros. +Docstrings are associated with the syntax transformer procedures. + +** The psyntax expander now knows how to interpret the @ and @@ special + forms. + +** The psyntax expander is now hygienic with respect to modules. + +Free variables in a macro are scoped in the module that the macro was +defined in, not in the module the macro is used in. For example, code +like this works now: + + (define-module (foo) #:export (bar)) + (define (helper x) ...) + (define-syntax bar + (syntax-rules () ((_ x) (helper x)))) + + (define-module (baz) #:use-module (foo)) + (bar qux) + +It used to be you had to export `helper' from `(foo)' as well. +Thankfully, this has been fixed. + +** New function, `procedure-module' + +While useful on its own, `procedure-module' is used by psyntax on syntax +transformers to determine the module in which to scope introduced +identifiers. + +** `eval-case' has been deprecated, and replaced by `eval-when'. + +The semantics of `eval-when' are easier to understand. It is still +missing documentation, however. + +** Guile is now more strict about prohibiting definitions in expression + contexts. + +Although previous versions of Guile accepted it, the following +expression is not valid, in R5RS or R6RS: + + (if test (define foo 'bar) (define foo 'baz)) + +In this specific case, it would be better to do: + + (define foo (if test 'bar 'baz)) + +It is certainly possible to circumvent this resriction with e.g. +`(module-define! (current-module) 'foo 'baz)'. We would appreciate +feedback about this change (a consequence of using psyntax as the +default expander), and may choose to revisit this situation before 2.0 +in response to user feedback. + +** Defmacros must now produce valid Scheme expressions. + +It used to be that defmacros could unquote in Scheme values, as a way of +supporting partial evaluation, and avoiding some hygiene issues. For +example: + + (define (helper x) ...) + (define-macro (foo bar) + `(,helper ,bar)) + +Assuming this macro is in the `(baz)' module, the direct translation of +this code would be: + + (define (helper x) ...) + (define-macro (foo bar) + `((@@ (baz) helper) ,bar)) + +Of course, one could just use a hygienic macro instead: + + (define-syntax foo + (syntax-rules () + ((_ bar) (helper bar)))) + +** Guile's psyntax now supports docstrings and internal definitions. + +The following Scheme is not strictly legal: + + (define (foo) + "bar" + (define (baz) ...) + (baz)) + +However its intent is fairly clear. Guile interprets "bar" to be the +docstring of `foo', and the definition of `baz' is still in definition +context. + +** Macros need to be defined before their first use. + +It used to be that with lazy memoization, this might work: + + (define (foo x) + (ref x)) + (define-macro (ref x) x) + (foo 1) => 1 + +But now, the body of `foo' is interpreted to mean a call to the toplevel +`ref' function, instead of a macro expansion. The solution is to define +macros before code that uses them. + +** Functions needed by macros at expand-time need to be present at + expand-time. + +For example, this code will work at the REPL: + + (define (double-helper x) (* x x)) + (define-macro (double-literal x) (double-helper x)) + (double-literal 2) => 4 + +But it will not work when a file is compiled, because the definition of +`double-helper' is not present at expand-time. The solution is to wrap +the definition of `double-helper' in `eval-when': + + (eval-when (load compile eval) + (define (double-helper x) (* x x))) + (define-macro (double-literal x) (double-helper x)) + (double-literal 2) => 4 + +See the (currently missing) documentation for eval-when for more +information. + +** New variable, %pre-modules-transformer + +Need to document this one some more. + +** Temporarily removed functions: `macroexpand', `macroexpand-1' + +`macroexpand' will be added back before 2.0. It is unclear how to +implement `macroexpand-1' with syntax-case, though PLT Scheme does prove +that it is possible. ** New reader macros: #' #` #, #,@ @@ -253,211 +448,61 @@ XXX Need to decide whether to document this for 2.0, probably should: make-syncase-macro, make-extended-syncase-macro, macro-type, syncase-macro-type, syncase-macro-binding -** `(ice-9 syncase)' has been deprecated. - -As syntax-case is available by default, importing `(ice-9 syncase)' has -no effect, and will trigger a deprecation warning. - -** Fix bug in `module-bound?'. - -`module-bound?' was returning true if a module did have a local -variable, but one that was unbound, but another imported module bound -the variable. This was an error, and was fixed. - -** BUG: Automatic compilation will be attempted when it shouldn't. - -For example, the old (lang elisp) modules are meant to be interpreted, -not compiled. This bug will be fixed before 2.0. FIXME 2.0: Should say -something here about module-transformer called for compile. - -** Defmacros may now have docstrings. - -Indeed, any macro may have a docstring. `object-documentation' from -`(ice-9 documentation)' may be used to retrieve the docstring, once you -have a macro value -- but see the above note about first-class macros. -Docstrings are associated with the syntax transformer procedures. - -** `eval-case' has been deprecated, and replaced by `eval-when'. - -The semantics of `eval-when' are easier to understand. It is still -missing documentation, however. - -** Guile is now more strict about prohibiting definitions in expression - contexts. - -Although previous versions of Guile accepted it, the following -expression is not valid, in R5RS or R6RS: - - (if test (define foo 'bar) (define foo 'baz)) - -In this specific case, it would be better to do: - - (define foo (if test 'bar 'baz)) - -It is certainly possible to circumvent this resriction with e.g. -`(module-define! (current-module) 'foo 'baz)'. We would appreciate -feedback about this change (a consequence of using psyntax as the -default expander), and may choose to revisit this situation before 2.0 -in response to user feedback. - -** Defmacros must now produce valid Scheme expressions. - -It used to be that defmacros could unquote in Scheme values, as a way of -supporting partial evaluation, and avoiding some hygiene issues. For -example: - - (define (helper x) ...) - (define-macro (foo bar) - `(,helper ,bar)) - -Assuming this macro is in the `(baz)' module, the direct translation of -this code would be: - - (define (helper x) ...) - (define-macro (foo bar) - `((@@ (baz) helper) ,bar)) - -Of course, one could just use a hygienic macro instead: - - (define-syntax foo - (syntax-rules () - ((_ bar) (helper bar)))) - -** Guile's psyntax now supports docstrings and internal definitions. - -The following Scheme is not strictly legal: - - (define (foo) - "bar" - (define (baz) ...) - (baz)) - -However its intent is fairly clear. Guile interprets "bar" to be the -docstring of `foo', and the definition of `baz' is still in definition -context. - -** Macros need to be defined before their first use. - -It used to be that with lazy memoization, this might work: - - (define (foo x) - (ref x)) - (define-macro (ref x) x) - (foo 1) => 1 - -But now, the body of `foo' is interpreted to mean a call to the toplevel -`ref' function, instead of a macro expansion. The solution is to define -macros before code that uses them. - -** Functions needed by macros at expand-time need to be present at - expand-time. - -For example, this code will work at the REPL: - - (define (double-helper x) (* x x)) - (define-macro (double-literal x) (double-helper x)) - (double-literal 2) => 4 - -But it will not work when a file is compiled, because the definition of -`double-helper' is not present at expand-time. The solution is to wrap -the definition of `double-helper' in `eval-when': - - (eval-when (load compile eval) - (define (double-helper x) (* x x))) - (define-macro (double-literal x) (double-helper x)) - (double-literal 2) => 4 - -See the (currently missing) documentation for eval-when for more -information. - -** New variable, %pre-modules-transformer - -Need to document this one some more. - -** Temporarily removed functions: `macroexpand', `macroexpand-1' - -`macroexpand' will be added back before 2.0. It is unclear how to -implement `macroexpand-1' with syntax-case, though PLT Scheme does prove -that it is possible. - -** New module: (rnrs bytevector) - -See the R6RS for more information. - -** New dependency: GNU libunistring. - - -FIXME bytevectors. - -FIXME unistring. - -more robust threading support. - -syncase knows about @/@@ - -macros and hygiene and modules - -eval-closure-module? what? - -procedure-module / scm_procedure_module - -guile-config info sitedir change -- 922d369 - -guile-config and pkg-config - -(system xref), procedure-callers, procedure-callees, can work as -variables get redefined +** A new 'memoize-symbol evaluator trap has been added. This trap can +be used for efficiently implementing a Scheme code coverage. -getrlimit and setrlimit wrappers +** Duplicate bindings among used modules are resolved lazily. +This slightly improves program startup times. -FIXME: getrlimit crazy namespaces... +** New thread cancellation and thread cleanup API +See `cancel-thread', `set-thread-cleanup!', and `thread-cleanup'. -add method-formals +** Fix bad interaction between `false-if-exception' and stack-call. -BUG? procedure-property 'arity on compiled procedures will be wrong +Exceptions thrown by `false-if-exception' were erronously causing the +stack to be saved, causing later errors to show the incorrectly-saved +backtrace. This has been fixed. -BUG: SCM_SNAME -> SCM_SUBR_NAME +** New global variables: %load-compiled-path, %load-compiled-extensions -(ice-9 session): -add-value-help-handler! remove-value-help-handler! -add-name-help-handler! remove-name-help-handler! -export module-commentary -procedure-arguments +These are analogous to %load-path and %load-extensions. -procedure->memoizing-macro, procedure->syntax totally superdeprecated? +** New procedure, `make-promise' -FIXME: update copyrights +`(make-promise (lambda () foo))' is equivalent to `(delay foo)'. -ecmascript support? +** New entry into %guile-build-info: `ccachedir' -new repl... +** Fix bug in `module-bound?'. -guile-tools compile, guile-tools disassemble (does that work?) +`module-bound?' was returning true if a module did have a local +variable, but one that was unbound, but another imported module bound +the variable. This was an error, and was fixed. -BUG: stack walks to see number of frames, then fills those frames. -sometimes those numbers differ, warning to console, a test case would be -nice. +** `(ice-9 syncase)' has been deprecated. -FIXME: dance disassembly bug +As syntax-case is available by default, importing `(ice-9 syncase)' has +no effect, and will trigger a deprecation warning. -srfi-18 +* Changes to the C interface - has formals, body slots; (make-procedure & procedure ?) +** The GH interface (deprecated in version 1.6, 2001) was removed. -FIXME: rewrite while +** Internal `scm_i_' functions now have "hidden" linkage with GCC/ELF -removed (the-environment) +This makes these internal functions technically not callable from +application code. -new function: scm_module_public_interface +** Functions for handling `scm_option' now no longer require an argument +indicating length of the `scm_t_option' array. -BUG: help at guile prompt +** scm_primitive_load_path has additional argument, exception_on_error -new procedure, make-promise +** New C function: scm_module_public_interface -* New modules (see the manual for details) +This procedure corresponds to Scheme's `module-public-interface'. -** `(srfi srfi-18)', multithreading support -** The `(ice-9 i18n)' module provides internationalization support +** scm_stat has additional argument, exception_on_error * Changes to the distribution @@ -467,29 +512,23 @@ In other words the GNU Lesser General Public License, version 3 or later (at the discretion of each person that chooses to redistribute part of Guile). -* Changes to the stand-alone interpreter -* Changes to Scheme functions and syntax - -** A new 'memoize-symbol evaluator trap has been added. This trap can -be used for efficiently implementing a Scheme code coverage. +** `guile-config' will be deprecated in favor of `pkg-config' -** Duplicate bindings among used modules are resolved lazily. -This slightly improves program startup times. - -** New thread cancellation and thread cleanup API -See `cancel-thread', `set-thread-cleanup!', and `thread-cleanup'. +`guile-config' has been rewritten to get its information from +pkg-config, so this should be a transparent change. Note however that +guile.m4 has yet to be modified to call pkg-config instead of +guile-config. -* Changes to the C interface +** New installation directory: $(pkglibdir)/1.9/ccache -** The GH interface (deprecated in version 1.6, 2001) was removed. +If $(libdir) is /usr/lib, for example, Guile will install its .go files +to /usr/lib/guile/1.9/ccache. These files are architecture-specific. -** Internal `scm_i_' functions now have "hidden" linkage with GCC/ELF +** New dependency: GNU libunistring. -This makes these internal functions technically not callable from -application code. +See http://www.gnu.org/software/libunistring/. We hope to merge in +Unicode support in the next prerelease. -** Functions for handling `scm_option' now no longer require an argument -indicating length of the `scm_t_option' array. Changes in 1.8.7 (since 1.8.6)