- It is now possible to assign to bindings in another module using
setproperty!(::Module, ::Symbol, x)
. ([#44137]) - Slurping in assignments is now also allowed in non-final position. This is
handled via
Base.split_rest
. ([#42902]) - Character literals now support the same syntax allowed in string literals; i.e. the syntax can
represent invalid UTF-8 sequences as allowed by the
Char
type ([#44989]). - Support for Unicode 15 ([#47392]).
- Nested combinations of tuples and named tuples of symbols are now allowed as type parameters ([#46300]).
- New builtins
getglobal(::Module, ::Symbol[, order])
andsetglobal!(::Module, ::Symbol, x[, order])
for reading from and writing to globals.getglobal
should now be preferred for accessing globals overgetfield
. ([#44137]) - The
@invoke
macro introduced in 1.7 is now exported. Additionally, it now usesCore.Typeof(x)
rather thanAny
when a type annotation is omitted for an argumentx
so that types passed as arguments are handled correctly. ([#45807]) - The
invokelatest
function and@invokelatest
macro introduced in 1.7 are now exported. ([#45831])
- The known quadratic behavior of type inference is now fixed and inference uses less memory in general. Certain edge cases with auto-generated long functions (e.g. ModelingToolkit.jl with partial differential equations and large causal models) should see significant compile-time improvements. ([#45276], [#45404])
- Non-concrete call sites can now be union-split to be inlined or statically-resolved even
if there are multiple dispatch candidates. This may improve runtime performance in certain
situations where object types are not fully known statically but mostly available at runtime
(as like Julia-level type inference implementation itself) by statically resolving
@nospecialize
-d call sites and avoiding excessive compilation. ([#44512]) - All the previous usages of
@pure
-macro inBase
has been replaced with the preferredBase.@assume_effects
-based annotations. ([#44776]) invoke(f, invokesig, args...)
calls to a less-specific method than would normally be chosen forf(args...)
are no longer spuriously invalidated when loading package precompile files. ([#46010])
- In Linux and Windows,
--threads=auto
now tries to infer usable number of CPUs from the process affinity which is set typically in HPC and cloud environments ([#42340]). --math-mode=fast
is now a no-op ([#41638]). Users are encouraged to use the @fastmath macro instead, which has more well-defined semantics.- The
--threads
command-line option now acceptsauto|N[,auto|M]
whereM
specifies the number of interactive threads to create (auto
currently means 1) ([#42302]). - New option
--heap-size-hint=<size>
gives a memory hint for triggering greedy garbage collection. The size might be specified in bytes, kilobytes(1000k), megabytes(300M), gigabytes(1.5G)
Threads.@spawn
now accepts an optional first argument::default
or:interactive
. An interactive task desires low latency and implicitly agrees to be short duration or to yield frequently. Interactive tasks will run on interactive threads, if any are specified when Julia is started ([#42302]).- Threads started outside the Julia runtime (e.g. from C or Java) can now become able to
call into Julia code by calling
jl_adopt_thread
. This is done automatically when entering Julia code viacfunction
or a@ccallable
entry point. As a consequence, the number of threads can now change during execution ([#46609]).
Iterators.flatmap
was added ([#44792]).- New helper
Splat(f)
which acts likex -> f(x...)
, with pretty printing for inspecting which functionf
was originally wrapped. ([#42717]) - New
pkgversion(m::Module)
function to get the version of the package that loaded a given module, similar topkgdir(m::Module)
. ([#45607]) - New function
stack(x)
which generalisesreduce(hcat, x::Vector{<:Vector})
to any dimensionality, and allows any iterators of iterators. Methodstack(f, x)
generalisesmapreduce(f, hcat, x)
and is efficient. ([#43334]) - New macro
@allocations
which is similar to@allocated
except reporting the total number of allocations rather than the total size of memory allocated. ([#47367])
- A known concurrency issue of
iterate
methods onDict
and other derived objects such askeys(::Dict)
,values(::Dict)
, andSet
is fixed. These methods ofiterate
can now be called on a dictionary or set shared by arbitrary tasks provided that there are no tasks mutating the dictionary or set ([#44534]). - Predicate function negation
!f
now returns a composed function(!) ∘ f
instead of an anonymous function ([#44752]). RoundFromZero
now works for non-BigFloat
types ([#41246]).Dict
can be now shrunk manually bysizehint!
([#45004]).@time
now separates out % time spent recompiling invalidated methods ([#45015]).eachslice
now works over multiple dimensions;eachslice
,eachrow
andeachcol
return aSlices
object, which allows dispatching to provide more efficient methods ([#32310]).@kwdef
is now exported and added to the public API ([#46273])- An issue with order of operations in
fld1
is now fixed ([#28973]). - Sorting is now always stable by default as
QuickSort
was stabilized in ([#45222]).
- The methods
a / b
andb \ a
witha
a scalar andb
a vector, which were equivalent toa * pinv(b)
, have been removed due to the risk of confusion with elementwise division ([#44358]). - We are now wholly reliant on libblastrampoline (LBT) for calling BLAS and LAPACK. OpenBLAS is shipped by default, but building the system image with other BLAS/LAPACK libraries is not supported. Instead, it is recommended that the LBT mechanism be used for swapping BLAS/LAPACK with vendor provided ones. ([#44360])
lu
now supports a new pivoting strategyRowNonZero()
that chooses the first non-zero pivot element, for use with new arithmetic types and for pedagogy ([#44571]).normalize(x, p=2)
now supports any normed vector spacex
, including scalars ([#44925]).
- Error messages for bad format strings have been improved, to make it clearer what & where in the format string is wrong. ([#45366])
randn
andrandexp
now work for anyAbstractFloat
type definingrand
([#44714]).
-
Meta-e
now opens the current input in an editor. The content (if modified) will be executed upon existing the editor. -
The contextual module which is active at the REPL can be changed (it is
Main
by default), via theREPL.activate(::Module)
function or via typing the module in the REPL and pressing the keybinding Alt-m ([#33872]). -
An "IPython mode" which mimics the behaviour of the prompts and storing the evaluated result in
Out
can be activated withREPL.ipython_mode!()
. See the manual for how to enable this at startup.
- New fail-fast mode for testsets that will terminate the test run early if a failure or error occurs.
Set either via the
@testset
kwargfailfast=true
or by setting env varJULIA_TEST_FAILFAST
to"true"
i.e. in CI runs to request the job failure be posted eagerly when issues occur ([#45317])
- The package environment (active project,
LOAD_PATH
,DEPOT_PATH
) are now propagated when adding local workers (e.g. withaddprocs(N::Int)
or through the--procs=N
command line flag) ([#43270]). addprocs
for local workers now accept theenv
keyword argument for passing environment variables to the workers processes. This was already supported for remote workers ([#43270]).
graphemes(s, m:n)
returns a substring of them
-th ton
-th graphemes ins
([#44266]).
- DelimitedFiles has been promoted from being a standard library to a separate package. It now has to be explicitly installed to be used.
- Unexported
splat
is deprecated in favor of exportedSplat
, which has pretty printing of the wrapped function. ([#42717])
- Printing of
MethodError
and methods (such as frommethods(my_func)
) are now prettified and color consistent with printing of methods in stacktraces. ([#45069])