We are pleased to announce GNU Guile release 3.0.11, the latest in the 3.0 stable release series.
Guile 3.0.11 is a bug-fix release that also adds support for "SRFI 197: Pipeline Operators" and "SRFI 207: String-notated bytevectors" (bytestrings), overhauls SRFI 64 (testing), adds JIT support for the RISC-V architecture, and includes many other improvements. See the NEWS extract below for full details. Here are the compressed sources: https://ftp.gnu.org/gnu/guile/guile-3.0.11.tar.gz (9.6MB) https://ftp.gnu.org/gnu/guile/guile-3.0.11.tar.lz (5.4MB) https://ftp.gnu.org/gnu/guile/guile-3.0.11.tar.xz (5.7MB) Here are the GPG detached signatures: https://ftp.gnu.org/gnu/guile/guile-3.0.11.tar.gz.sig https://ftp.gnu.org/gnu/guile/guile-3.0.11.tar.lz.sig https://ftp.gnu.org/gnu/guile/guile-3.0.11.tar.xz.sig Use a mirror for higher download bandwidth: https://www.gnu.org/order/ftp.html Here are the SHA1 checksums: 3ccecd8e5493d7d1d7db8ac9cb27ac21359f738e guile-3.0.11.tar.gz f3a9c390c8f1364c1e44fff5baf38943a62087d5 guile-3.0.11.tar.lz 6547ee884a3baae287fdb411cb6661fffa3b9a87 guile-3.0.11.tar.xz and the SHA256 checksums: PJwWlypzu3knUvLk8cznIS12ONVJS19+jhnzgZ2/Ohk guile-3.0.11.tar.gz DOUxeY8tgMvbJ2STCN6VoalAxzCQS2zzdroExm3FU34 guile-3.0.11.tar.lz gYx50jZlen+pb7NkE3zHtBs73uDWXGF0ygN2lVlXlGA guile-3.0.11.tar.xz The SHA256 checksum is base64 encoded, instead of the hexadecimal encoding that most checksum tools default to. Use a .sig file to verify that the corresponding file (without the .sig suffix) is intact. First, be sure to download both the .sig file and the corresponding tarball. Then, run a command like this: gpg --verify guile-3.0.11.tar.gz.sig If that command fails because you don't have the required public key, or that public key has expired, try the following commands to retrieve or refresh it, and then rerun the 'gpg --verify' command. gpg --recv-keys 3CE464558A84FDC69DB40CFB090B11993D9AEBB5 As a last resort to find the key, you can try the official GNU keyring: wget -q https://ftp.gnu.org/gnu/gnu-keyring.gpg gpg --keyring gnu-keyring.gpg --verify guile-3.0.11.tar.gz.sig An extract from NEWS follows. * Notable changes ** Guile supports SRFI-207: String notated bytevectors (bytestrings) Guile can now read and write #u8"\xe2;\x88;\x9e; Improbability\n" style bytestrings when they are enabled by `(read-enable 'bytestrings)` and `(print-enable 'bytestrings)` respectively. See "SRFI-207 String-notated bytevectors" in the info pages for additional information. All of the SRFI-207 procedures have also been added, including support for hex and base64 encoding and decoding. ** R7RS `cond-expand` now supports `else` (<https://debbugs.gnu.org/71304>) ** The SRFI-64 module for test suites has been rewritten A new, backward-compatible implementation of (srfi srfi-64) has been contributed by Tomas Volf. The reference implementation, which was used so far, had a number of issues on Guile that made some of its interface downright unusable (e.g., <https://bugs.gnu.org/72378>), non-conforming (e.g., <https://bugs.gnu.org/72383>), or buggy (e.g., <https://bugs.gnu.org/72372>). * New interfaces and functionality ** Guile now supports SRFI-197 (Pipeline Operators) Guile now provides chain, chain-and, chain-when, chain-lambda, nest, and nest-reverse. ** Guile now supports SRFI-244 (Multiple-value Definitions) Guile now provides syntax 'define-values' under the module (srfi srfi-244). This syntax existed for a long time in the core of Guile, now it is also exported via srfi-244 to help writing portable code. ** PEG parser PEG grammar parser in (ice-9 peg string-peg) has been rewritten to cover all the functionality defined in <https://bford.info/pub/lang/peg.pdf>. The 'not-in-range' pattern was also added to (ice-9 peg); it is available from PEG strings via '[^...]'. ** GOOPS: Introduce new forms method* and define-method* The module (oop goops) now exports method* and define-method* which are the counterparts of lambda* and define* in they provide support for advanced argument handling such as optional and keyword arguments. The implementation fully supports (next-method) calls, also for keyword arguments. The new syntax is documented in the Guile Reference manual. ** (ice-9 rdelim) has new line and field iteration procedures (ice-9 rdelim) has three new procedures: for-rdelim-from-port, for-delimited-from-port and for-line-in-file. Of these, for-line-in-file is helpful in the common situation where you want a procedure applied to every line in a file. ** Add procedure (%inhibit-welcome-message) to silence the REPL welcome If ((@ (system repl repl) %inhibit-welcome-message) #t) is set in $HOME/.guile, the welcome message in the REPL is suppressed. ** Improve 'load-foreign-library' handling of DLLs The non-libltdl load-foreign-library introduced in 3.0.6 does not handle some common cases with libtool-generated DLLs. It has been updated to search for DLLs that have a version number appended to the name by libtool, such as libfoo-1.dll. Also, it has been updated to do library renaming for MSYS. On Cygwin, when the #:rename-on-cygwin? option is #t, it already had the capability to search for "libfoo" as "cygfoo.dll". It has been updated to add the capability to search for "libfoo" as "msys-foo.dll" on MSYS. The load-foreign-library option #:rename-on-cygwin? has been changed to #:host-type-rename?, and handles both Cygwin and MSYS. ** Make piped-process and system* available on systems without fork Now that piped-process and system* are implemented in terms of `posix_spawn', they can be made available on systems without fork(). Note that currently Guile does use fork in piped-process to set exit codes, so piped-process on systems without fork will have a different behavior with regards to exit codes. ** MinGW: remove kill, getaffinity, setaffinity, getpriority, and setpriority Now that Guile uses a posix_spawn module, these Win32 emulations of POSIX functions no longer work. They relied on Guile keeping an internal handle-to-pid table, which is not part of the new posix_spawn code. They are removed on MinGW. ** MinGW: waitpid returns ENOSYS if options are non-zero When Guile switched to using posix_spawn module, Guile's Win32 emulation of waitpid could no longer emulate ENOHANG. It relied on Guile keeping an internal handle-to-pid table. It now returns ENOSYS on any non-zero waitpid option. ** The JIT (lightening) supports the riscv architecture * Performance improvements ** 'copy-file' now relies on 'sendfile' rather than a read/write loop ** The performance of 'letrec' compilation has been improved * Miscellaneous improvements ** Some array function error messages have been improved ** The psyntax implementation has been improved ** Many Cygwin/MSYS incompatibilities have been fixed * Documentation updates ** The '-C', '--rNrs', and '--language' arguments are now included in 'guile(1)' ** Now documented: 'peek', 'pk', 'in-vicinity', and 'use-modules' '#:hide' ** The way to avoid SXML escaping has been documented ** SRFI-64 (test suite) documentation has been added ** 'setlocale' now mentions that it raises a 'system-error' for missing locales * Changes to the distribution * Build system changes ** -Werror=array-bounds is now added to CFLAGS when available This catches <https://bugs.gnu.org/76907> ** Parallel builds should no longer fail due to a missing guile-procedures.txt ** Some sparse file tests are now skipped on Darwin hosts While APFS does support sparse files, they behave differently. ** Guile now compiles with GCC 14 and musl on 32-bit systems ** Compilation with '-Werror=undef' works again (broken in 3.0.10) ** Some missing, readonly, and typical 'copy-file' tests have been added ** The test suite now supports SRFI-64 based tests This support should be considered internal for now and subject to change. * Bug fixes ** `basename` now checks the suffix against the base name, not the full path (<https://bugs.gnu.org/69437>) ** UTF-8 string hashing no longer risks overrun with empty strings ** test-hashing works again on 32-bit systems ** GUILE-VERSION changes now propagate to .version and relevant Makefiles (<https://bugs.gnu.org/72084>) ** Compiler no longer crashes when building Guile on 32-bit platforms (<https://bugs.gnu.org/71891>) ** Compiler no longer crashes when inlining 3.0.9 procedure with kw args (<https://bugs.gnu.org/72936>) ** Guile is compiled with -fexcess-precision=standard for i[3456]86 when possible (<https://bugs.gnu.org/43262>) ** Fix setjmp/longjmp-related crashes on Windows (<https://bugs.gnu.org/73167>) ** Fix compilation with GCC 14 and musl on 32-bit systems (<https://bugs.gnu.org/73835>) ** Immutable stringbufs are now 8-byte aligned on all systems Previously they could end up with an alignment that violated the type tag for their type (e.g. ending up tagged as immediates SCM_IMP()). ** `readdir` and `ttyname` now release scm_i_misc_mutex during asyncs This avoids potential deadlocks. ** Displaying a `port` won't fail when `ttyname` returns ENODEV `ttyname` may return ENODEV even when the port `isatty()`, and previously Guile would pass through the related exception. Now it prints the file descriptor instead (as it does when `ttyname` isn't available or the port isn't a tty). ** Fix build error when cross-compiling to MinGW (<https://bugs.gnu.org/75642>) ** Change <libguile/scm.h> to allow compilation with -Werror=undef (<https://bugs.gnu.org/75085>) ** 'all-threads' no longer includes the finalizer thread (<https://bugs.gnu.org/76343>) Previously 'all-threads' would include the finalizer thread. This, in turn, would trigger warnings from 'primitive-fork' and 'environ' suggesting they are being called in a multi-threaded context, when in fact user code did not create any thread. ** Calling 'environ' without arguments in a multi-threaded program is OK This used to trigger a warning, unduly. ** SRFI-19: 'date->string' converter ~V is now correctly interpreted (<https://bugs.gnu.org/74841>) ** When -flto is enabled configure now adds -ffat-lto-objects if it exists Otherwise libguile.a can end up with no code. https://lintian.debian.org/tags/no-code-sections.html ** r6rs-ports.test custom ports tests should no longer fail on stray closes Previously the custom ports weren't explicitly closed, causing GC-related closes to produce spurious "log" events in other tests. ** getsockopt no longer risks a buffer overrun with timestamps (<https://bugs.gnu.org/76907>) ** 'string->uri-reference' now allows a trailing "." (<https://bugs.gnu.org/53201>) ** A bug in the Tree-IL verifier's handling of exact integers has been fixed ** The guile-3.0.pc pkg-config file now includes 'LIB_GETRANDOM' ** 'make-custom-port' now handles a '#f' '%default-port-encoding' ** Computing the buildstamp invokes 'date' more portably (<https://bugs.gnu.org/26121>) ** A C23 incompatibility in libguile/jit.c has been fixed ** 'readlink' on Darwin hosts now handles ports correctly ** 'pipe' on Darwin hosts now reports 'ENOSYS' when flags are provided Previously that provoked a 'system-error' with a zero errno value. (<https://bugs.gnu.org/72547>) ** A numer of test incompatibilities with Darwin hosts have been fixed (<https://bugs.gnu.org/72547>) ** define guile-test as non-declarative because it uses load ** make-struct/no-tail and scm_c_make_structv no longer segfault Previously they could if given the standard-vtable-fields, but inital values that weren't compatible with a vtable. (<https://bugs.gnu.org/78789>) ** 'tmpfile' preserves O_CLOEXEC so children won't prevent removal on exit ** Concurrent 'scm_with_guile' invocations no longer risk segfaulting <https://bugs.gnu.org/79100> ** 'spawn' should no longer risk segfaulting on at least FreeBSD ** A memory leak in 'spawn' has been fixed ** Issues preventing 'make check' from succeeding on FreeBSD have been fixed * Thanks to (at least) Adam Faiz, Andrew McNulty, Andy Wingo, Arne Babenhauserheide, Arun Isaac, Brennan Vincent, Dale P. Smith, Daniel Llorens, Daphne Preston-Kendal, David Thompson, Ekaitz Zarraga, Francesco P. Lovergine, Hannes Müller, Helmut Eller, Ido Yariv, Jessica Tallon, Jonas Hahnfeld, Juliana Sims, Ludovic Courtès, Matthew Wette, Maxim Cournoyer, Michael Gran, Michael Käppler, Mikael Djurfeldt, Morgan Smith, Natanael Copa, Nikolaos Chatzikonstantinou, Noé Lopez, Olivier Dion, Richard Sent, Rob Browning, Simon Josefsson, Taylan Kammer, Thomas Klausner, Tomas Volf, Werner Lemberg, Yuval Langer, Zheng Junjie, Zhu Zihao, a aa, and euouae.
