several other languages have a construct like this so maybe julia should as well? basically `tap` just lets you insert side effects into `|>` chains, kind of like how `@aside` in `Chain.jl` does. but it's pretty basic and I think useful for more than just data sciency pipelines so might deserve a spot in `Base` see also: [Ruby: `tap`](https://ruby-doc.org/core-2.7.1/Object.html#method-i-tap) [Kotlin: `also`](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/also.html) [Elixir: `tap`](https://hexdocs.pm/elixir/Kernel.html#tap/2) [Scala: `tap`](https://www.scala-lang.org/api/current/scala/util/ChainingOps.html) [Rust: `inspect` (kinda)]( https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.inspect) probably would close https://github.com/JuliaLang/julia/issues/25233 in the negative for reserved syntax but in the positive for the spirit of the request. also potentially could combine it with the proposal in https://github.com/JuliaLang/julia/issues/47200 --------- Co-authored-by: Jeff Bezanson <jeff.bezanson@gmail.com>
6.3 KiB
Julia v1.14 Release Notes
New language features
- It is now possible to control which version of the Julia syntax will be used to parse a package by setting the
compat.juliaorsyntax.julia_versionkey in Project.toml. This feature is similar to the notion of "editions" in other language ecosystems and will allow non-breaking evolution of Julia syntax in future versions. See the "Syntax Versioning" section in the code loading documentation ([#60018]). ᵅ(U+U+1D45),ᵋ(U+1D4B),ᶲ(U+1DB2),˱(U+02F1),˲(U+02F2), andₔ(U+2094) can now also be used as operator suffixes, accessible as\^alpha,\^epsilon,\^ltphi,\_<,\_>, and\_schwaat the REPL ([#60285]).- The
@labelmacro can now create labeled blocks that can be exited early withbreak name [value]. Use@label name exprfor named blocks or@label exprfor anonymous blocks. Anonymous@labelblocks participate in the default break scope: a plainbreakorbreak _exits the innermost breakable scope, whether it is a loop or an@labelblock. Thecontinuestatement also supports labels withcontinue nameto continue a labeled loop ([#60481]). typegroupblocks allow defining mutually recursive struct types that reference each other in their field types. All types in the group are resolved atomically at the end of the block ([#60569]).
Language changes
Compiler/Runtime improvements
- Type inference now refines field types through conditional checks and call signatures.
For example, after
if !isnothing(x.field), inference knowsx.fieldis notnothingwithin the branch. Similarly, after a call likefunc(x.field)wherefunc(::Int)is the only matching method, inference refinesx.fieldtoInt. This works for immutable struct fields andconstfields of mutable structs. Mutable (non-const) fields are not supported due to the lack of per-object memory effect tracking; for those, the recommended pattern remains storing the field value in a local variable before the check (e.g.val = x.field; if !isnothing(val) ... end) ([#41199], [#47574]). - Stack traces now show full method signatures with argument types for inlined frames, matching the display of non-inlined frames ([#53925]).
Command-line option changes
-P <project>is now a shorthand for--project <project>([#59867]).
Multi-threading changes
- New functions
Threads.atomic_fence_heavyandThreads.atomic_fence_lightprovide support for asymmetric atomic fences, speeding up atomic synchronization where one side of the synchronization runs significantly less often than the other ([#60311]). Threads.@threadsnow supports array comprehensions with syntax like@threads [f(i) for i in 1:n], filtered comprehensions like@threads [f(i) for i in 1:n if condition(i)], typed comprehensions like@threads Float64[f(i) for i in 1:n], and multi-dimensional comprehensions like@threads [f(i,j) for i in 1:n, j in 1:m](preserves dimensions). All scheduling options (:static,:dynamic,:greedy) are supported. Results preserve element order for:staticand:dynamicscheduling;:greedydoes not guarantee order. Non-indexable iterators are also supported. ([#59019])
Build system changes
New library functions
tap(f)creates a function that callsf(x)for side effects and returnsx. ([#61340]).Base.generating_output()has been madepublic(but not exported) to allow checking whether the current process is performing compilation for a pkgimage/sysimage ([#61224]).
New library features
-
IOContextsupports a new booleanhexunsignedoption that allows for printing unsigned integers in decimal instead of hexadecimal ([#60267]). -
The
StringViewtype wraps anAbstractVector{UInt8}and interprets it as a UTF-8 encoded string, superseding the StringViews.jl package ([#60526]). -
Package precompilation now supports running precompilation in a background task and has new interactive keyboard controls:
cto cleanly cancel immediately,dto detach,ifor a profile peek,vto toggle verbose mode showing elapsed time, CPU%, and memory usage, and?for help. ([#60943]).
Standard library changes
codepoint(c)now succeeds for overlong encodings.Base.ismalformed,Base.isoverlong, andBase.show_invalidare nowpublicand documented (but not exported) ([#55152]).
JuliaSyntaxHighlighting
LinearAlgebra
Markdown
- Support "raw" or "inline" HTML inside Markdown data ([#60629], [#60632], [#60732])
- Support autolinks for email addresses (#60570)
- Many improvements and bugfixes for rendering Markdown lists in a terminal ([#55456], [#60519])
- Strikethrough text via
~strike~or~~through~~is now supported by the Markdown parser. ([#60537]) - Many, many bug fixes and minor tweaks; overall behavior is now much closer to CommonMark ([#59977], [#60502])
Profile
Random
REPL
Test
-
@test,@test_throws, and@test_brokennow support acontextkeyword argument that provides additional information displayed on test failure. This is useful for debugging which specific case failed in parameterized tests ([#60501]). -
@test_throws,@test_warn,@test_nowarn,@test_logs, and@test_deprecatednow supportbrokenandskipkeyword arguments for consistency with@test([#60543]). -
New functions
detect_closure_boxesanddetect_closure_boxes_allfind methods that allocateCore.Boxin their lowered code, which can indicate performance issues from captured variables in closures.
Dates
unix2datetimenow accepts a keyword argumentlocaltime=trueto use the host system's local time zone instead of UTC ([#50296]).
InteractiveUtils
less/@lessandedit/@editare now supported for documented variables ([#53539]).