Julia v1.3 Release Notes

# Julia v1.3 Release Notes

## New language features

- Support for Unicode 12.1.0 (#32002).
- Methods can now be added to an abstract type (#31916).
- Support for unicode bold digits and double-struck digits 0 through 9 as valid identifiers (#32838).
- Added the syntax `var"#str#"` for printing and parsing non-standard variable names (#32408).

## Language changes

## Multi-threading changes

- New experimental `Threads.@spawn` macro that runs a task on any available thread (#32600).
- All system-level I/O operations (e.g. files and sockets) are now thread-safe. This does not include subtypes of `IO` that are entirely in-memory, such as `IOBuffer`, although it specifically does include `BufferStream`. (#32309, #32174, #31981, #32421).
- The global random number generator (`GLOBAL_RNG`) is now thread-safe (and thread-local) (#32407).
- New `Channel(f::Function, spawn=true)` keyword argument to schedule the created Task on any available thread, matching the behavior of `Threads.@spawn` (#32872).
- Simplified the `Channel` constructor, which is now easier to read and more idiomatic julia. Use of the keyword arguments `csize` and `ctype` is now discouraged (#30855, #32818).

## Build system changes

## New library functions

- `findfirst`, `findlast`, `findnext` and `findprev` now accept a character as first argument to search for that character in a string passed as the second argument (#31664).
- New `findall(pattern, string)` method where `pattern` is a string or regex (#31834).
- `count(pattern, string)` gives the number of things `findall` would match (#32849).
- `istaskfailed` is now documented and exported, like its siblings `istaskdone` and `istaskstarted` (#32300).
- `RefArray` and `RefValue` objects now accept index `CartesianIndex()` in `getindex` and `setindex!` (#32653)
- Added `sincosd(x)` to simultaneously compute the sine and cosine of `x`, where `x` is in degrees (#30134).
- The function `nonmissingtype`, which removes `Missing` from type unions, is now exported (#31562).

## Standard library changes

- `Pkg` can now download and install binary artifacts through the `Pkg.Artifacts` submodule and supporting functions. (#32918)
- When `wait` (or `@sync`, or `fetch`) is called on a failing `Task`, the exception is propagated as a `TaskFailedException` wrapping the task. This makes it possible to see the location of the original failure inside the task (as well as the location of the `wait` call, as before) (#32814).
- `Regex` can now be multiplied (`*`) and exponentiated (`^`), like strings (#23422).
- `Cmd` interpolation (``$(x::Cmd) a b c`` where) now propagates `x`'s process flags (environment, flags, working directory, etc) if `x` is the first interpolant and errors otherwise (#24353).
- Zero-dimensional arrays are now consistently preserved in the return values of mathematical functions that operate on the array(s) as a whole (and are not explicitly broadcasted across their elements). Previously, the functions `+`, `-`, `*`, `/`, `conj`, `real` and `imag` returned the unwrapped element when operating over zero-dimensional arrays (#32122).
- `IPAddr` subtypes now behave like scalars when used in broadcasting (#32133).
- `Pair` is now treated as a scalar for broadcasting (#32209).
- `clamp` can now handle missing values (#31066).
- `empty` now accepts a `NamedTuple` (#32534).
- `mod` now accepts a unit range as the second argument to easily perform offset modular arithmetic to ensure the result is inside the range (#32628).
- `nothing` can now be `print`ed, and interpolated into strings etc. as the string `"nothing"`. It is still not permitted to be interpolated into Cmds (i.e. $echo `$(nothing)`$ will still error without running anything.) (#32148)
- When `open` is called with a function, command, and keyword argument (e.g. `open(`ls`, read=true) do f ...`) it now correctly throws a `ProcessFailedException` like other similar calls (#32193).
- `mktemp` and `mktempdir` now try, by default, to remove temporary paths they create before the process exits (#32851).
- Added argument `keep` to `unescape_string` (#27125).

#### Libdl

- `dlopen()` can now be invoked in `do`-block syntax, similar to `open()`.

#### LinearAlgebra

- The BLAS submodule no longer exports `dot`, which conflicts with that in LinearAlgebra (#31838).
- `diagm` and `spdiagm` now accept optional `m,n` initial arguments to specify a size (#31654).
- `Hessenberg` factorizations `H` now support efficient shifted solves `(H+µI) \ b` and determinants, and use a specialized tridiagonal factorization for Hermitian matrices. There is also a new `UpperHessenberg` matrix type (#31853).
- Added keyword argument `alg` to `svd` and `svd!` that allows one to switch between different SVD algorithms (#31057).
- Five-argument `mul!(C, A, B, α, β)` now implements inplace multiplication fused with addition C = A B α + C β (#23919).

#### SparseArrays

- `SparseMatrixCSC(m,n,colptr,rowval,nzval)` perform consistency checks for arguments: `colptr` must be properly populated and lengths of `colptr`, `rowval`, and `nzval` must be compatible with `m`, `n`, and `eltype(colptr)`.
- `sparse(I, J, V, m, n)` verifies lengths of `I`, `J`, `V` are equal and compatible with `eltype(I)` and `m`, `n`.

#### Dates

- `DateTime` and `Time` formatting/parsing now supports 12-hour clocks with AM/PM via `I` and `p` codes, similar to `strftime` (#32308).

#### Statistics

- `mean` now accepts both a function argument and a `dims` keyword (#31576).

#### Sockets

- `Sockets.recvfrom` now returns both host and port as an InetAddr (#32729).
- Added `InetAddr` constructor from `AbstractString`, representing IP address, and `Integer`, representing port number (#31459).

#### Miscellaneous

- `foldr` and `mapfoldr` now work on any iterator that supports `Iterators.reverse`, not just arrays (#31781).

## Deprecated or removed

- `@spawn expr` from the `Distributed` standard library should be replaced with `@spawnat :any expr` (#32600).
- `Threads.Mutex` and `Threads.RecursiveSpinLock` have been removed; use `ReentrantLock` (preferred) or `Threads.SpinLock` instead (#32875).

## External dependencies

## Tooling Improvements

- The `ClangSA.jl` static analysis package has been imported, which makes use of the clang static analyzer to validate GC invariants in Julia's C code. The analysis may be run using `make -C src analyzegc`.