Julia 1.13 Reaches Release Candidate With Mutually Recursive Types, a flisp-Free Constructor Path, and Unicode 17
Julia 1.13 hit its first release candidate on April 29, adding mutually recursive types and moving default constructor generation out of the language's Scheme bootstrap layer.
Overview
The Julia programming language has reached the release-candidate stage for its next minor version. The first release candidate, tagged v1.13.0-rc1, was published on April 29 and is described by its maintainers as the “First release candidate for the upcoming 1.13.0 release,” according to the GitHub release notes. The candidate caps a beta cycle that began with v1.13.0-beta1 on January 13, per the project’s GitHub releases page.
Julia, first released as version 1.0 in August 2018 according to Wikipedia, is a dynamically typed language built around multiple dispatch and aimed at high-performance numerical and technical computing. The 1.13 development line brings a mix of user-facing language additions and deeper changes to how the compiler bootstraps itself.
What We Know
The headline language change is support for mutually recursive types. “Julia now supports mutually recursive types,” the project wrote in its This Month in Julia World digest, which explained that such types “occur when two or more types reference each other, which is common in data structures like trees and graphs but has been challenging to express cleanly in Julia.”
The same digest details a structural change beneath the surface: default constructor generation has moved out of the language’s bootstrap layer. “Default constructor generation has been moved from C/flisp to Julia,” the project wrote, noting that when a developer defines a struct, “the compiler automatically generates default constructor methods” and that this “code generation was previously handled in C and flisp (the Scheme dialect used in Julia’s bootstrap process), but has now been rewritten in Julia itself.” According to the digest, the move is “preparatory work for a flisp-free bootstrap using JuliaLowering” — part of a longer effort to remove the embedded Scheme interpreter from Julia’s foundations.
On the surface-level features, the official NEWS.md for the release-1.13 branch lists a new @__FUNCTION__ macro “to refer to the innermost enclosing function” and “Support for Unicode 17.” The release notes also record a change to string hashing: “The hash algorithm and its values have changed for certain types, most notably AbstractString,” with the NEWS warning that “Any hash specializations for equal types to those that changed, such as some third-party string packages, may need to be deleted.” The reworked hash(::AbstractString) is now described as “a zero-copy / zero-cost function.”
Concurrency and tooling also see additions. The release notes introduce a new AbstractSpinLock abstract type, with SpinLock now a subtype of it, alongside a PaddedSpinLock that “has extra padding to avoid false sharing.” A new nth function provides access “to the n-th element of a generic iterable,” and a new --trace-eval command-line option shows “expressions being evaluated during top-level evaluation.”
What We Don’t Know
As of mid-June, the GitHub releases page lists v1.12.6 — dated April 10 — as the latest stable release, and shows no stable v1.13.0 tag, meaning the release candidate had not yet been promoted to a final release. The project has not published a firm calendar date for the stable 1.13.0 release; the rc1 notes direct users to NEWS.md “for what will be new in 1.13” rather than to a fixed ship date.
The practical impact of the string-hashing change on the broader package ecosystem is also not yet quantified. The release notes flag that third-party string packages with hash specializations “may need to be deleted,” but the number of affected packages is not stated in the source.
Analysis
The 1.13 cycle illustrates a pattern common to maturing languages: the most visible additions — a macro here, a Unicode bump there — sit atop slower-moving infrastructure work. Moving constructor generation from the C and flisp bootstrap into Julia itself does not change what most users write, but it advances the project’s stated goal of a “flisp-free bootstrap,” reducing the language’s dependence on an embedded Scheme dialect that has been part of its internals since the early days. Mutually recursive types, meanwhile, address a long-standing ergonomic gap the maintainers themselves describe as historically “challenging to express cleanly,” making graph- and tree-shaped data models easier to declare.