We are pleased to announce GNU Guile release 3.0.9, the latest in the 3.0 stable release series, corresponding to 138 commits by 27 people since 3.0.8. This release provides many bug fixes as well as new functionality, including new bindings to POSIX interfaces. See the ‘NEWS’ excerpt below for details. Compared to the previous stable series (2.2.x), Guile 3.0 adds support for just-in-time native code generation, speeding up all Guile programs. Guile is an implementation of the Scheme programming language, packaged for use in a wide variety of environments. In addition to implementing the R5RS, R6RS, and R7RS Scheme standards, Guile includes full access to POSIX system calls, networking support, multiple threads, dynamic linking, a foreign function call interface, powerful string processing, and HTTP client and server implementations. Guile can run interactively, as a script interpreter, and as a Scheme compiler to VM bytecode. It is also packaged as a library so that applications can easily incorporate a complete Scheme interpreter/VM. An application can use Guile as an extension language, a clean and powerful configuration language, or as multi-purpose "glue" to connect primitives provided by the application. It is easy to call Scheme code from C code and vice versa. Applications can add new functions, data types, control structures, and even syntax to Guile, to create a domain-specific language tailored to the task at hand. Check out the web page for more info and resources: https://gnu.org/software/guile Guile 3.0.9 can be installed in parallel with Guile 2.2.x; see http://www.gnu.org/software/guile/manual/html_node/Parallel-Installations.html. Here are the compressed sources: https://ftp.gnu.org/gnu/guile/guile-3.0.9.tar.gz (9.3MB) https://ftp.gnu.org/gnu/guile/guile-3.0.9.tar.lz (5.2MB) https://ftp.gnu.org/gnu/guile/guile-3.0.9.tar.xz (5.5MB) Here are the GPG detached signatures: https://ftp.gnu.org/gnu/guile/guile-3.0.9.tar.gz.sig https://ftp.gnu.org/gnu/guile/guile-3.0.9.tar.lz.sig https://ftp.gnu.org/gnu/guile/guile-3.0.9.tar.xz.sig Use a mirror for higher download bandwidth: https://www.gnu.org/order/ftp.html Here are the SHA1 and SHA256 checksums: 6ce38ec3fefc19aa08d4662e9b054f7018a72004 guile-3.0.9.tar.gz GFJQea0poNRtFcdlgbXZHIcCMBv9ghZm0uHRNyYWKBE guile-3.0.9.tar.gz bcc02997587cdd03a831ee8d7153cad92629dc3f guile-3.0.9.tar.lz vA7go2D7E5GcFOtuJFMxmt8eyZgojJk4KbzxePtIzJo guile-3.0.9.tar.lz bf6af1aac320a56233d4d8c0fbeb2c0dca474eab guile-3.0.9.tar.xz GiYlrHKyNm6VeS8/51j9Lfd1tARKkKSpeHMm5mwNdQ0 guile-3.0.9.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.9.tar.gz.sig The signature should match the fingerprint of the following key: pub rsa4096 2014-08-11 [SC] 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 uid [ unknown] Ludovic Courtès uid [ unknown] Ludovic Courtès uid [ unknown] Ludovic Courtès (Inria) 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.9.tar.gz.sig This release was bootstrapped with the following tools: Autoconf 2.71 Automake 1.16.5 Libtool 2.4.7 Gnulib v0.1-5703-g356a414e8c Makeinfo 7.0.1 Changes in 3.0.9 (since 3.0.8) * Notable changes * New interfaces and functionality ** New `spawn' procedure to spawn child processes The new `spawn' procedure creates a child processes executing the given program. It lets you control the environment variables of that process and redirect its standard input, standard output, and standard error streams. Being implemented in terms of `posix_spawn', it is more portable, more robust, and more efficient than the combination of `primitive-fork' and `execl'. See "Processes" in the manual for details, and see the 2019 paper entitled "A fork() in the road" (Andrew Baumann et al.) for background information. `system*', as well as the `open-pipe' and `pipeline' procedures of (ice-9 popen) are now implemented in terms of `posix_spawn' as well, which fixes bugs such as redirects: . ** `open-file' now supports an "e" flag for O_CLOEXEC Until now, the high-level `open-file' facility did not provide a way to pass O_CLOEXEC to the underlying `open' call. It can now be done by appending "e" to the `mode' string passed as a second argument. See "File Ports" in the manual for more info. ** `pipe' now takes flags as an optional argument This lets you pass flags such as O_CLOEXEC and O_NONBLOCK, as with the pipe2(2) system call found on GNU/Linux and GNU/Hurd, instead of having to call `fnctl' afterwards. See "Ports and File Descriptors" in the manual for details. ** Bindings to `openat' and friends The procedures `openat', `open-fdes-at', `statat', `chownat', `unlinkat', `chmodat', `renameat', `mkdirat' and `symlinkat' have been added. They resolve file names relative to a directory passed as a file port. The procedures `chdir' `readlink' and `utime' have been extended to support file ports. The related flags `AT_REMOVEDIR' and `AT_EACCESS' have been added. See `File System' in the manual ** Abstract Unix-domain sockets are supported It is now possible to create an AF_UNIX socket with a leading zero byte in its file name to create an abstract Unix-domain socket. See "man 7 unix" for information on abstract Unix-domain sockets. ** New socket-related constants defined The `IN6ADDR_ANY' and `IN6ADDR_LOOPBACK' are now defined on systems with IPv6 support; they can be used with `bind'. Likewise, the `IPPROTO_IPV6' and `IPV6_V6ONLY' constants are defined, for use with `setsockopt'. ** New `bytevector-slice' procedure As an extension to the R6RS interface, the new (rnrs bytevectors gnu) module defines `bytevector-slice', which returns a bytevector that aliases part of an existing bytevector. See "Bytevector Slices" in the manual. ** Disassembler now shows intrinsic names Disassembler output now includes the name of intrinsics next to each `call-' instruction (info "(guile) Intrinsic Call Instructions"). ** Linker and assembler consume less memory Previously, the entire output ELF file contents would be stored in memory when compiling as with `guild compile'. This is no longer the case. * Bug fixes ** JIT compilation is now supported on Apple M1 processors (https://bugs.gnu.org/44505) ** Type sizes are correctly determined when cross-compiling (https://bugs.gnu.org/54198) ** psyntax honors source properties coming from read hash extensions (https://bugs.gnu.org/54003) ** ./configure checks whether the linker supports '-flto' (needed on macOS) ** libguile/srfi-14.i.c is now longer shipped and is instead built from source (https://bugs.gnu.org/54111) ** Cross-compilation supports triplets with empty vendor strings (https://bugs.gnu.org/54915) ** It is possible to use a 'library-form' inside 'cond-expand' in R7RS libraries (https://bugs.gnu.org/55934) ** 'coverage-data->lcov' accepts a #:modules argument as documented (https://bugs.gnu.org/54911) ** 'connect' returns #f upon EAGAIN, not just EINPROGRESS ** (web http) capitalizes the "Basic" authorization header ** (web http) terminates chunked encoding with an extra \r\n ** (web client) retries TLS handshake upon non-fatal errors (https://bugs.gnu.org/49223) ** 'primitive-load' opens files as O_CLOEXEC (https://bugs.gnu.org/57567) ** Baseline compiler no longer crashes on (not (list 1 2)) (https://bugs.gnu.org/58217) ** Fix documentation of ‘mkdir’ Previously, the documentation implied the umask was ignored if the mode was set explicitly. However, this is not the case. ** 'system*' honors output/error port redirects (https://bugs.gnu.org/52835) ** 'open-input-pipe' & co. are now much faster (https://bugs.gnu.org/59321) ** Fix crash with out-of-bound indexes with `string-ref' and `fluid-ref*' (https://bugs.gnu.org/60488, https://bugs.gnu.org/58154) ** Fix infinite loop when compiling (make-vector) (https://bugs.gnu.org/60522) Many thanks to everyone who contributed to Guile, in particular to the following people for their contributions to code and documentation: 2 Aleix Conchillo Flaqué 5 Andrew Whatson 3 Andy Wingo 1 Antoine Kalmbach 1 Arne Babenhauserheide 3 Christopher Baines 1 Colin Woodbury 7 Daniel Llorens 2 Fulbert 5 Jean Abou Samra 1 Jessica Tallon 3 Josselin Poiret 1 Liliana Marie Prikler 58 Ludovic Courtès 14 Maxime Devos 5 Michael Gran 1 Mihail Iosilevich 1 Mikael Djurfeldt 13 Mike Gran 1 Olivier Dion 1 Rob Browning 1 Sergei Trofimovich 1 Taylor R Campbell 2 Timothy Sample 2 Vijay Marupudi 1 Zhang Ning 2 jgart Ludo’.