Releases: uiua-lang/uiua
Releases · uiua-lang/uiua
0.10.3
0.10.2
0.10.1
0.10.0
0.10.0 - 2024-04-04
You can find the release announcement here.
Language
- Breaking Change - Multiline strings are now also raw strings which do not require escaping
- They are no longer format strings by default
- Raw strings can be made format strings with an extra
$
, i.e.$$ …
- Breaking Change -
try ⍣
's handler function is now passed the original arguments before the error try ⍣
now works with function packs of more than 2 functions- This tries each function in the pack in order
- Switch functions now format to use
⟨⟩
brackets- This makes them easier to identify when reading
- It also allows switch functions to be used as modifier arguments without extra nesting
- Switch functions now work with
under ⍜
- Add pattern matching with
un °
- Constant values can now be inverted to form a function which errors if the top value on the stack does not match
- Format strings can be inverted to extract substrings
- Read more in the new Pattern Matching tutorial
- Git modules are no longer experimental
- Modules are added automatically as Git submodules when imported
- See the Modules tutorial for more information
map
and related functionsinsert
,has
,get
, andremove
are no longer experimental- Add the
mask ⦷
function, which creates a mask of occurrences of one array in another- This works similarly to
find ⌕
, but is better when you need a mask or to distinguish between adjacent occurrences
- This works similarly to
- Change
sine ∿
's glyph∿
is more representative of what it does- Most circle glyphs like
○
are used for array functions or stack manipulation ○
will continue to work and will be formatted as∿
under ⍜
join ⊂
now works with arrays of the same rank as long as the row count does not changeun °
scan \\
now works withequals =
andnot equals ≠
group ⊕
can now take multidimensional index arrayspartition ⊜
can now take multidimensional marker arraysunder ⍜
select ⊏
andpick ⊡
now work with duplicate indices if the values at those indices are the samerotate ↻
now works through boxesfold ∧
now works withunder ⍜
if its function doesinventory ⍚
can now take 3 or more arraysrepeat ⍥
can now take non-scalar repetition counts- This repeats the function a different number of times for each row of the inputs
select ⊏
can now be used withun °
to separate intoclassify ⊛
anddeduplicate ◴
- Characters can now be
multiply ×
d ordivide ÷
d by numbers to possibly toggle their case - Add the
csv
function, which encodes and decodes CSV data - Add the
&clget
and&clset
system functions, which allow copying and pasting text to and from the system clipboard - Add more shadowable constants
- Importing modules that use the
# Experimental!
comment now requires the# Experimental!
comment in the importing file - Doc comments may now be placed at the end of single-line functions
- Non-alphabetic identifiers can now be suffixed with
!
to make macros - Add
df
,ddf
, etc shortcuts fordip ⊙
fix ¤
- Existing macros are now called "stack macros" to distinguish them from the new "array macros"
- Stack macros are now hygienic
- Add array macros, which allow code to be generated and manipulated at compile time as strings
- These are specified with a
^
immediately following a binding's arrow - They are documented in the Macros tutorial
- These are specified with a
un °
pop ◌
can now be used to retrieve thefill ⬚
value- See more details in
fill ⬚
's documentation
- See more details in
- Add the wildcard constant
W
, which matches any number, and@\W
, which matches any character - Add the experimental
coordinate ⟔
function, which searches an array for a value and returns a multidimensional indexcoordinate ⟔
is topick ⊡
asindexof ⊗
is toselect ⊏
- Experimental function strands now use the
‿
character, which formats from__
- Add the experimental
by ⊸
modifier, which duplicates a function's last argument before calling it - Add the experimental
quote
modifier, which converts a string to code at compile time- This is useful in array macros
- Add
# No inline!
semantic comment, which prevents a function and its callers from being inlined- This enables better stack traces on errors
- Deprecate
bind
- Deprecate
deal
- It is rarely used and easy to express with other functions
- Deprecate experimental
shapes
andtypes
modifiers in favor of pattern matching - Remove
cross ⊠
for good - Remove
unpack ⊐
for good - Remove
rectify ⌅
for good - Remove
&i
for good - Make
reduce /
with a monadic function a hard error
Interpreter
- Code is now analyzed for purity
- All pure top-level expressions will attempt to evaluate at compile time
- All fragments of code that are pure and have a signature
|0.n
will be evaluated at compile time
- Add lots of LSP features
- Find references
- Rename is now cross-file
- On-type formatting (can be toggled in settings)
- Inlay hints (each can be toggled in settings)
- Binding function signatures
- Inline function signatures
- Values of top-level expressions
- Code actions
- Macro expansion
- Remove output comment
- Convert between strand and array syntax
- Completions
- Shadowable constants
- Module items when the module reference is partially typed
- Add the
--file <file>
option to theuiua repl
command- This runs a file before starting the REPL
- Improve the supported binding type coverage of
&ffi
- Add warnings for when a loop in an array may have a variable signature
- Various performance improvements
- Optimize and multithread
⊞(/+×)
, which is a common component of matrix multiplication
- Optimize and multithread
- Lots of bug and crash fixes
Website
- Tutorials
- Add a Working with Strings tutorial
- Add array macros to the Macros tutorial
- Add the Pattern Matching tutorial
- Add some modifier compatibility tables to documentation
- Hide experimental glyphs in the editor by default
- They can be toggled on in the settings
- An
# Experimental!
comment can now be easily inserted via a settings button or withCtrl+E
- Add horizontal scrolling to pad output
- Pad tabs are now given titles according to their contents
- The pad now renders strings that are SVG as images
- Add a pad setting for autoplaying audio
0.9.5
0.9.4
0.9.3
0.9.2
0.9.2 - 2024-02-25
Interpreter
- Fix a bug involving patterns like
°°[…]
0.9.0
0.9.0 - 2024-02-25
Language
- Breaking Change -
repeat ⍥
withinfinity ∞
now does a fixed-point iteration rather than an infinite loop- You can still do an infinite loop with
do ⍢
(…)1
- You can still do an infinite loop with
- Breaking Change -
reshape ↯
with a shape with negative dimensions now reverses that axis rather than acting as a "fill" value- The "fill" behavior can still be achieved by setting an axis to
infinity ∞
- The "fill" behavior can still be achieved by setting an axis to
- Breaking Change -
&ad
and&imd
now return an encoding format as a string in addition to the media data - Overhaul the module system
- Custom modifiers are now called "macros"
- Rather than requiring signatures, placeholders are now a sort of function that operates on the macro's arguments
- This allows for more complex and flexible code-reuse
- Existing code should continue to work. Existing placeholders will be formatted into the new syntax.
- You can read more about macros in the updated Macros tutorial
- Add the
on ⟜
modifier, which captures a commonfork ⊃
pattern in a more readable way join ⊂
can now be used withunder ⍜
- This only works when the joined arrays have different ranks
join ⊂
can now be used withun °
to separate the first row of an array from the resttry ⍣
's handler's function signature is now more flexible- This makes it easier to either provide a default value, process the error itself, or do something different with the inputs
- A
fill ⬚
value set outside a looping modifier will now no longer be available inside the loop- This should make it easier to scope
fill ⬚
correctly
- This should make it easier to scope
fill ⬚
can now match the lengths of inputs torows ≡
- Add recursion via refering to a binding's name within its body
- Extend some math functions to work with characters
sign ±
gets the case of a characterabsolute value ⌵
uppercases a characternegate ¯
toggles the case of a character
range ⇡
can now be used with negative numberseta η
,pi π
,tau τ
andinfinity ∞
are now parsed as numbers rather than functions- This lets them syntactically bind with
¯
or form fraction literals
- This lets them syntactically bind with
- Add the
inventory ⍚
modifier, which iterates over the unboxed items of an array and re-boxes the results- This shortens a lot of box array code
- Change
content ◇
's glyph to reflect its relationship withinventory ⍚
. Code using⊔
will continue to work and will be formatted as◇
. content ◇
can now be used withunder ⍜
if its function does- Macros with 2 or more arguments can now use
‼
at the end of their names. Macro names with any combination of!
and‼
will be automatically parsed and formatted as‼
s followed by one!
if necessary. f
can now be used at the beginning of planet notation shorthand forfork ⊃
- Inline functions are no longer required to be in a binding or modifier
- This allows arbitrary code to be wrapped and marked with a signature
- Remove cosine and arccosine optimizations
- The inverse of the cosine idiom created a logical inconsistency
pop ◌
can now be used withunder ⍜
- This is only useful when
pop ◌
is composed with other functions
- This is only useful when
- Breaking Change - Flip the order of
send
's arguments - Add the
pool
modifier, which is identical tospawn
but spawns a thread in a thread pool &rs
can now take a count ofinfinity ∞
to read until the end of the stream- Add the
&runs
system function, which runs a command and returns an IO stream handle - Add the experimental
stringify
modifier, which turns its function into a string without calling it- This is useful in macros
- Add the experimental
signature
modifier, which returns the arguments and output of its function without calling it- This is useful in macros
- Add the experimental
&ffi
system function, which allows calling functions from shared libraries - Add experimental function strands. Putting a
_
between two functions (or a function and a constant), is equivalent to putting them in()
s- This is experimental because it remains to be seen how this may affect readability
- Add experimental labels, denoted by a
$
immediately followed by an identifier, which attach a name to an array. This has two uses:- Labels are visible in output and in
stack
diagnostics - Labels in code make it easier to understand when reading
- Labels are visible in output and in
- Add experimental
shapes
andtypes
modifiers, which validate the shape and type of an array or arrays- These both check array properties at runtime and serve as a form of documentation
&var
now throws an error if the variable is not found- Deprecate
pop ◌
formatting from;
- Deprecate
all ⋔
- It was rarely used and was hard to reason about
- Add an experimental
repr
function that produces a string representation of a value in a format that can be read by the interpreter
Interpreter
- Lots of bug and crash fixes
- Lots of performance improvements and optimizations
- Numbers that seem to have a floating-point epsilon rounding error will be output with the epsilon noted
- Language Server
Website
- Add Tutorial Introduction
- Add primitives.json for use with tooling
- Tutorials are now in a
/tutorial
route instead of/docs
0.8.0
0.8.0 - 2024-01-31
Language
- Add the
content ⊔
modifier, which unboxes its function's arguments before calling it - Add the
unique ◰
function, which creates a mask of the first occurrence of each unique value in an array- Change
deduplicate ◴
's glyph to reflect its relationship withunique ◰
. Code using⊖
will continue to work and will be formatted as◴
.
- Change
table ⊞
now works on rows of arrays but keeps it's optimizations for lists- You never wanted element-wise combinations of multi-dimensional arrays anyway
- Deprecate
cross ⊠
, as it is now redundant - This is technically a breaking change, but it is unlikely to break much code
fill ⬚
can now be used to specify default accumulators forreduce /
,group ⊕
, andpartition ⊜
- Breaking Change - Reducing
group ⊕
andpartition ⊜
no longer take a required accumulator - Breaking Change -
fill ⬚
can no longer be temporarily disabled. Try to scope it to the smallest function.
- Breaking Change - Reducing
- Breaking Change - Most non-pervasive monadic functions no longer implicitely unbox their argument
- This impliciteness led to some unexpected behavior, particularly when getting the
length ⧻
orshape △
of a boxed array - Exceptions are
reverse ⇌
andtranspose ⍉
, which work on box elements without unboxing them
- This impliciteness led to some unexpected behavior, particularly when getting the
- Unicode escape sequences that are not 2 or 4 bytes long can now be specified with
\u{…}
- Change
pop ◌
's glyph to make it look good in planet notation. Code using;
will continue to work and will be formatted as◌
. un °
reduce /
multiply ×
now gives the prime factorization of a numberclassify ⊛
anddeduplicate ◴
now work withunder ⍜
&fras
and&frab
now work withunder ⍜
- Completely remove the deprecated
unbox ⊔
- Add experimental hashmap functions, which operate on a box array as if it is a hashmap
- Add experimental
bind
modifier, which binds local values within a function- This introduces some non-tacitness to the language
Interpreter
- The internal byte array type is now used in more places, which should improve performance a bit
&ime
and&imd
now support the QOI image format- Lots of bug and crash fixes
Website
- Add a new tutorial: Thinking With Arrays