Julia v1.12 Release Notes
New language features
A new keyword argument
usings::Boolhas been added tonames. By using this, we can now find all the names available in moduleAbynames(A; all=true, imported=true, usings=true). (#54609)the
@atomic(...)macro family supports now the reference assignment syntax, e.g.@atomic :monotonic v[3] += 4modifiesv[3]atomically with monotonic ordering semantics. (#54707) The supported syntax allowsatomic fetch (
x = @atomic v[3]),atomic set (
@atomic v[3] = 4),atomic modify (
@atomic v[3] += 2),atomic set once (
@atomiconce v[3] = 2),atomic swap (
x = @atomicswap v[3] = 2), andatomic replace (
x = @atomicreplace v[3] 2=>5).
Language changes
When methods are replaced with exactly equivalent ones, the old method is no longer deleted implicitly simultaneously, although the new method does take priority and become more specific than the old method. Thus if the new method is deleted later, the old method will resume operating. This can be useful to mocking frameworks (such as in SparseArrays, Pluto, and Mocking, among others), as they do not need to explicitly restore the old method. While inference and compilation still must be repeated with this, it also may pave the way for inference to be able to intelligently re-use the old results, once the new method is deleted. (#53415)
Macro expansion will no longer eagerly recurse into into
Expr(:toplevel)expressions returned from macros. Instead, macro expansion of:toplevelexpressions will be delayed until evaluation time. This allows a later expression within a given:toplevelexpression to make use of macros defined earlier in the same:toplevelexpression. (#53515)
Compiler/Runtime improvements
Generated LLVM IR now uses actual pointer types instead of passing pointers as integers. This affects
llvmcall: Inline LLVM IR should be updated to usei8*orptrinstead ofi32ori64, and remove unneededptrtoint/inttoptrconversions. For compatibility, IR with integer pointers is still supported, but generates a deprecation warning. (#53687)A new exception
FieldErroris now introduced to raise/handlegetfieldexceptions. Previouslygetfieldexception was captured by fallback generic exceptionErrorException. Now thatFieldErroris more specificgetfieldrelated exceptions that can occur should useFieldErrorexception instead. (#54504)
Command-line option changes
The
-m/--moduleflag can be passed to run themainfunction inside a package with a set of arguments. Thismainfunction should be declared using@mainto indicate that it is an entry point.Enabling or disabling color text in Julia can now be controlled with the
NO_COLOR or FORCE_COLOR environment variables. (#53742).
--project=@tempstarts Julia with a temporary environment.New
--trace-compile-timingoption to report how long each method reported by--trace-compiletook to compile, in ms. (#54662)
Multi-threading changes
Build system changes
- There are new
Makefiles to build Julia and LLVM using the Binary Optimization and Layout Tool (BOLT), seecontrib/boltandcontrib/pgo-lto-bolt(#54107).
New library functions
logrange(start, stop; length)makes a range of constant ratio, instead of constant step (#39071)The new
isfull(c::Channel)function can be used to check ifput!(c, some_value)will block. (#53159)waitany(tasks; throw=false)andwaitall(tasks; failfast=false, throw=false)which wait multiple tasks at once (#53341).uuid7()creates an RFC 9652 compliant UUID with version 7 (#54834).insertdims(array; dims)allows to insert singleton dimensions into an array which is the inverse operation todropdimsThe new
Fixtype is a generalization ofFix1/Fix2for fixing a single argument (#54653).
New library features
invmod(n, T)whereTis a native integer type now computes the modular inverse ofnin the modular integer ring thatTdefines (#52180).invmod(n)is an abbreviation forinvmod(n, typeof(n))for native integer types (#52180).replace(string, pattern...)now supports an optionalIOargument to write the output to a stream rather than returning a string (#48625).sizehint!(s, n)now supports an optionalshrinkargument to disable shrinking (#51929).New function
Docs.hasdoc(module, symbol)tells whether a name has a docstring (#52139).New function
Docs.undocumented_names(module)returns a module's undocumented public names (#52413).Passing an
IOBufferas a stdout argument forProcessspawn now works as expected, synchronized withwaitorsuccess, so aBase.BufferStreamis no longer required there for correctness to avoid data races (#52461).After a process exits,
closewritewill no longer be automatically called on the stream passed to it. Callwaiton the process instead to ensure the content is fully written, then callclosewritemanually to avoid data-races. Or use the callback form ofopento have all that handled automatically.@timednow additionally returns the elapsed compilation and recompilation time (#52889)escape_stringtakes additional keyword argumentsascii=true(to escape all non-ASCII characters) andfullhex=true(to require full 4/8-digit hex numbers for u/U escapes, e.g. for C compatibility) #55099).filtercan now act on aNamedTuple(#50795).tempnamecan now take a suffix string to allow the file name to include a suffix and include that suffix in the uniquing checking (#53474)RegexMatchobjects can now be used to constructNamedTuples andDicts (#50988)Lockableis now exported (#54595)New
ltruncate,rtruncateandctruncatefunctions for truncating strings to text width, accounting for char widths (#55351)
Standard library changes
gcdx(0, 0)now returns(0, 0, 0)instead of(0, 1, 0)(#40989).fdreturns aRawFDinstead of anInt(#55080).
StyledStrings
JuliaSyntaxHighlighting
- A new standard library for applying syntax highlighting to Julia code, this uses
JuliaSyntaxandStyledStringsto implement ahighlightfunction that creates anAnnotatedStringwith syntax highlighting applied.
Package Manager
LinearAlgebra
rankcan now take aQRPivotedmatrix to allow rank estimation via QR factorization (#54283).Added keyword argument
algtoeigen,eigen!,eigvalsandeigvals!for self-adjoint matrix types (i.e., the type unionRealHermSymComplexHerm) that allows one to switch between different eigendecomposition algorithms (#49355).Added a generic version of the (unblocked) pivoted Cholesky decomposition (callable via
cholesky[!](A, RowMaximum())) (#54619).
Logging
Printf
Profile
Random
REPL
Using the new
usings=truefeature of thenames()function, REPL completions can now complete names that have been explicitlyusing-ed. (#54610)REPL completions can now complete input lines like
[import|using] Mod: xxx|e.g. completeusing Base.Experimental: @optousing Base.Experimental: @opaque. (#54719)the REPL will now warn if it detects a name is being accessed from a module which does not define it (nor has a submodule which defines it), and for which the name is not public in that module. For example,
mapis defined in Base, and executingLinearAlgebra.mapin the REPL will now issue a warning the first time occurs. (#54872)
SuiteSparse
SparseArrays
Test
Dates
Statistics
Distributed
Unicode
DelimitedFiles
InteractiveUtils
Deprecated or removed
External dependencies
- The terminal info database,
terminfo, is now vendored by default, providing a better REPL user experience whenterminfois not available on the system. Julia can be built without vendoring the database using the Makefile optionWITH_TERMINFO=0. (#55411)