Julia v1.12 Release Notes
New language features
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 eargerly recurse into into
Expr(:toplevel)
expressions returned from macros. Instead, macro expansion of:toplevel
expressions will be delayed until evaluation time. This allows a later expression within a given:toplevel
expression to make use of macros defined earlier in the same:toplevel
expression. (#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*
orptr
instead ofi32
ori64
, and remove unneededptrtoint
/inttoptr
conversions. For compatibility, IR with integer pointers is still supported, but generates a deprecation warning. (#53687)
Command-line option changes
- The
-m/--module
flag can be passed to run themain
function inside a package with a set of arguments. Thismain
function should be declared using@main
to indicate that it is an entry point.
Multi-threading changes
Build system changes
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).
New library features
invmod(n, T)
whereT
is a native integer type now computes the modular inverse ofn
in the modular integer ring thatT
defines (#52180).invmod(n)
is an abbreviation forinvmod(n, typeof(n))
for native integer types (#52180).replace(string, pattern...)
now supports an optionalIO
argument to write the output to a stream rather than returning a string (#48625).sizehint!(s, n)
now supports an optionalshrink
argument 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
IOBuffer
as a stdout argument forProcess
spawn now works as expected, synchronized withwait
orsuccess
, so aBase.BufferStream
is no longer required there for correctness to avoid data races (#52461). - After a process exits,
closewrite
will no longer be automatically called on the stream passed to it. Callwait
on the process instead to ensure the content is fully written, then callclosewrite
manually to avoid data-races. Or use the callback form ofopen
to have all that handled automatically. @timed
now additionally returns the elapsed compilation and recompilation time (#52889)filter
can now act on aNamedTuple
(#50795).tempname
can now take a suffix string to allow the file name to include a suffix and include that suffix in the uniquing checking (#53474)RegexMatch
objects can now be used to constructNamedTuple
s andDict
s (#50988)