Skip to content

Latest commit

 

History

History
1109 lines (1057 loc) · 83.6 KB

changelog.md

File metadata and controls

1109 lines (1057 loc) · 83.6 KB

Uiua Changelog

Uiua is not yet stable.

0.14.0 - 202?-??-??

This version is not yet released. If you are reading this on the website, then these changes are live here.

Language

  • Breaking Change: un ° json no longer attempts to form multidimensional arrays
    • This makes deserializing JSON more consistent
  • Add experimental inline macros
  • Add experimental binary function, which encodes and decodes arrays into a compact binary representation
  • Remove the previously deprecated experimental coordinate ⟔ function
  • Remove the previously deprecated experimental struct modifier
  • Remove the previously deprecated setinv and setund modifiers

Interpreter

  • The compiler and interpreter have been almost entirely rewritten to use a tree-based execution model rather than a bytecode model
    • This massively simplifies compilation as well as optimizations and the derivation of inverses
    • This should not affect any language semantics
  • Improve pattern matching error messages
  • Optimize the "root" pattern ⁿ%:1
  • Add an -e/--experimental flag to the uiua eval command to enable experimental features

Website

  • Add a new pad setting to show line values to the right of the code

0.13.0 - 2024-10-21

You can find the release announcement here.

Language

  • Breaking Change - minimum ↧ and maximum ↥ now compare boxes lexicographically
    • This makes them consistent with comparison functions like less than <
  • Breaking Change - gen now takes a shape argument and no longer outputs a new seed
  • Breaking Change - &clip now unifies &clget and &clset
  • Breaking Change - type numbers are now:
    • 0 for normal numbers
    • 1 for characters
    • 2 for boxes
    • 3 for complex numbers
    • This orders the types more or less as you're likely to need to handle them
    • In the future, if another number type is added, it can go at the end next to complex numbers
  • The experimental chunks ⑄ function's behavior has been moved to an extension on windows ◫
    • This also allows the specification of "stride"
    • This is inspired by APL's stencil ⌺ behavior
    • chunks ⑄ has been deprecated
  • Stabilize orient ⤸
    • Change its glyph to something with broader font support
    • will continue to work and will be formatted as
  • Add anti ⌝ modifier, which simplifies choosing certain inverses
  • Add obverse ⌅ modifier, which unifies the specification of inverses
  • un ° by ⊸ can now be used to access the "undo" part of a function's under ⍜ functionality
  • Stabilize below ◡
  • Rename ⤙ but and ⤚ with to with ⤙ and off ⤚
  • "Stack macros" are now called "index macros"
    • Stabilize existing placeholder indexing syntax (^0, ^1, etc.)
    • Deprecate existing stack-based macro placeholders (^!, ^., etc.)
  • assert ⍤ at the beginning of a line is now interpreted as a test in some contexts
  • parse ⋕ now parses complex values from both arbiand a+bi formats
  • un ° orient ⤸ is now equivalent to range ⇡ length ⧻ shape △ duplicate .
  • Add a feature to some under ⍜ functions that makes them more permissive of changes in rank
  • under ⍜ un ° bits ⋯ now preserves a minimum bit length
  • under ⍜ reverse ⇌, transpose ⍉, and rotate ↻ are now smarter with respect to the signature of under ⍜'s second function
    • For example ⍜⇌°⊂ behaves in a more useful way
  • under ⍜ length ⧻ now reshapes an array to have the transformed length
  • NaN and indices for pick ⊡ and select ⊏ now get the fill ⬚ value
  • scan \\ now accepts functions that take more than 2 arguments
    • The behavior is similar to the analogous behavior for reduce /
  • Allow on ⟜ to use function packs
  • Allow under ⍜ of scalar keep ▽
  • Add the graphemes function, which splits a string into unicode grapheme clusters
  • Add the &fmd system function, which creates a directory
  • Very large arrays are now displayed more concisely in output
  • Change and enhance the behavior of ; and ;;
    • You can read about the new behavior here
  • Add unicode escape sequences for entering arbitrary characters
    • A double backslash followed by a unicode hex number will format to the corresponding glyph
  • Add the timezone function, which gets the local timezone offset in hours
  • Scoped modules are now delimited by ┌─╴ and └─╴
    • These both format from the existing --- delimiters
  • Add a Lorem constant, which contains the Lorem Ipsum text
  • Add several color constants
  • Add pride flag constants
  • Add Cats image constant
  • Allow &raw to be inverted, acting as a getter for the raw state of the terminal
    • under ⍜&raw sets raw mode, and then returns it to the previous state
  • Experimentally allow fold ∧ to work with any signature
    • Excess values are collected into arrays
  • Add the experimental around ’ function, which duplicates the top value on the stack to the third-to-top position
  • Add experimental tuples ⧅ modifier
    • This unifies and extends the behavior of the choose and permute functions, which are now deprecated
    • This also replaces and deprecates the triangle modifier
  • Add experimental base function
    • This converts to and from base-N digits
  • Add an experimental sort ⍆ function
  • Add an experimental last ⊣ function
    • Getting the last row of an array is very common
  • Add experimental subscript modifiers
    • They modify the behavior of some functions and modifiers
    • You can read more about them here
  • Add experimental data definitions
    • These allow for structured data similar to structs and enums in other languages
    • They also allow a limited form of namable function arguments
    • The experimental struct modifier/macro has been deprecated in favor of data definitions
  • Add the experimental layout function, which renders text into an image array
  • astar no longer errors if no paths are found
  • Remove previously deprecated function strands

Interpreter

  • Add the uiua find command, which finds Uiua code that matches the given unformatted text
  • Add the uiua doc command, which shows the documentation for a function or modifier
  • Add checking for end-of-line signature comments
  • Add webp support to img
  • Some optimizations
  • Tweak the formatter to reduce excess vertical space
  • The formatter now aligns consecutive single-line bindings
  • uiua repl now has a -s/--stack flag to disable clearing the stack after each line
    • Clearing the stack is now the default
    • The -c/--clear has been removed
  • After programs finish executing, the terminal raw mode will be automatically disabled if it was left on.

Website

  • Add Ranges tutorial
  • Update the Inverses tutorial with information about anti ⌝ and obverse ⌅
  • Add an RSS Feed for the blog
  • Update the Testing Tutorial
  • In the pad, files created with &fwa will now persist between runs
  • Add the option to decouple running and formatting in the pad
  • Add a dropdown to the pad to insert named functions
  • Add buttons to the pad to download code and copy a markdown link
  • Git import URLs in the pad can now be Ctrl+clicked to open in a new tab
  • Improve the Constants page

0.12.3 - 2024-08-17

Language

  • Rename imen, gifen, and auden to img, gif, and audio to match the naming convention of other functions
    • The existing names will continue to work and will be formatted to the new names

0.12.2 - 2024-08-16

Interpreter

  • Fix a bug in formatting ¯0
  • Fix a bug with uasm serialization of non-standard numbers

0.12.1 - 2024-08-16

Interpreter

  • Use custom version of nokhwa crate so that &camcap can build

0.12.0 - 2024-08-16

You can find the release announcement here.

Language

  • Breaking Change - &runs now returns 3 handles rather than 1
    • This gives more precise control over stdin, stdout, and stderr
  • Breaking Change - un ° select ⊏ is now equivalent to range ⇡ length ⧻ duplicate .
  • Breaking Change - auden now takes a sample rate argument, and un °auden now returns the sample rate
    • This allows you to work with audio that is not at Uiua's default sample rate
  • Breaking Change - fill ⬚ no longer fills the shapes of inputs to rows ≡
    • It could lead to some unexpected behavior when trying to fill the shapes of outputs
  • Breaking Change - disable pattern matching inverses resulting from under ⍜
    • This is basically never what you want
    • Pattern matching via un ° still works as normal
  • Deprecate member ∊ and add memberof ∈
  • Rename media en/decoding system functions &ime, &gife, and &ae to non-system functions imen, gifen, and auden
    • Their implementation is not actually system-dependent
    • Existing &*e will format to the new names
    • The previously deprecated &*d decoding functions have been removed (use un ° on the encoding function)
  • Switch functions have been replaced with a switch ⨬ modifier
    • This makes the language more uniform
    • Code with existing switch functions in ⟨⟩s will continue to work and will format to use and ()s
  • Identifiers can now contain subscript numbers
    • They format from __ followed by some numbers
    • For example, X__1 will format to X₁
  • The utf function has been renamed to utf₈
  • Stabilize labels
  • windows ◫ can now use a fill ⬚ value to pad the array
    • This is useful for convolutions
  • Add new Scoped Modules
    • These allow you to create a module without creating a file
  • A Call or New function inside a module can now be called via the module's name
  • A module name used as a macro with ! now imports all names from the module into the macro's function's scope
    • This can shorten code when accessing many items from the same module
  • Add the datetime function, which splits a time into its date and time components
  • un ° shape △ now generates an array with the given shape and incrementing elements
  • un ° pick ⊡ is now equivalent to range ⇡ shape △ duplicate .
  • keep ▽ will now cycle counts if the counts array is shorter than the counted array
  • keep ▽ now works with non-integer scalar counts to scale an array
  • under ⍜ keep ▽ now allows increasing the kept array's rank
  • under ⍜ now works with common by ⊸ patterns
  • join ⊂ with rank differences greater than 1 can now extend the smaller array
  • couple ⊟ with different ranks can now extend the smaller array
  • indexof ⊗ now works with fill ⬚ to set the default for when a value is not found
  • un ° join ⊂ is now easier to combine with other inverses
  • repeat ⍥ can now repeat a negative number of times, which will repeat the inverse
  • un ° repeat ⍥ now requires the repetition count to be inside the un ° function
    • This makes the inverted signature correct
  • inventory ⍚ no longer does each ∵-like behavior
    • This got in the way more than it helped
  • Non-scalar switch ⨬ and repeat ⍥ now follow the same distribution and fix ¤ rules as rows ≡
  • Add the # Track caller! semantic comment, which prevents stack traces from going below the function that contains it
  • Add the experimental chunks ⑄ function, which splits an array into chunks of a given size
  • Add the experimental choose and permute functions for combinatorics solutions
  • Add the experimental triangle ◹ modifier, which calls a function on shrinking suffixes of an array's rows
  • Add the experimental orient function, which arranges an array's axes in a specified order
  • Add the experimental fft function, which performs the Fast Fourier transform
    • The inverse FFT is also supported via un °
  • Add the experimental astar modifier, which performs the A* pathfinding algorithm
  • Add the experimental but ⤙ and with ⤚ modifiers, which are compliments to on ⟜ and by ⊸
  • Add the experimental above ◠ and below ◡ modifiers, which keep all arguments to a function above or below the outputs on the stack
  • Add the experimental struct macro, which generates constructor and getter functions given some names
  • Un-deprecate dip ⊙ function packs
  • Deprecate the experimental coordinate ⟔ function, as it is seldom needed and easy to implement with other functions
    • It can be mostly replaced with ⊢⊚⌕
  • Deprecate experimental stack and array swizzles
    • They don't fit my vision for the language
  • Deprecate implicit GitHub domain in "git: ..." modules
    • GitHub should not be a default
  • Adjacent trace ⸮s now function as a single trace ⸮ of more values
  • N+1 adjacent stack ?s now format to N trace ⸮s
  • Add the &camcap system function, which captures a frame from a camera

Interpreter

  • A ton of bug and crash fixes
  • Some optimizations
  • Git modules are now cloned instead of being added as submodules
    • Add the uiua module command to list or update cloned modules
  • Add some media constants:
    • Logo - the Uiua logo
    • Lena - a good example image for image processing
    • Music - a snippet of musical audio
  • LSP improvements
    • Show array shapes on hover
    • Code action to insert # Experimental! comment
  • REPL improvements
    • The stack is now preserved between REPL lines
      • Pass the -c/--clear flag to clear it automatically after each line
    • Add some commands, which can be listed by typing help in the repl
  • Allow Uiua-specific tokens types to be disabled in the LSP

Website

  • Add new Tacit Code Tutorial
  • Add new Code Tactility Tutorial
  • Fix a bug where running pad code that has end-of-line comments via ctrl+Enter would cause the cursor to move every time
  • Remove the Uiuisms page
    • It provided a "definitive" implementation of many algorithms where the best implementation is subjective and/or context-dependent
    • It is not how I want people to approach learning Uiua
    • It is not something I am interested in maintaining

0.11.1 - 2024-06-06

Interpreter

  • Some bug and crash fixes

0.11.0 - 2024-06-02

You can find the release announcement here.

Language

  • Breaking Change - un ° fix ¤ now does pattern matching
  • Breaking Change - un ° on ⟜ now does pattern matching in some cases
    • This makes its behavior conform to the rule that a function's inverse must have the opposite signature
    • Some other cases, such as °⟜+, now properly invert the function
  • Breaking Change - keep ▽ with a scalar counts array now copies each row that many times
    • This matches the behaviors of APL and BQN, and is generally more useful
    • The old behavior can be achieved with /⊂↯
  • Breaking Change - fill ⬚ values are no longer accessible through function calls
  • Stabilize by ⊸!
  • Stabilize repr
  • Add experimental stack swizzles, which allow for more flexible stack reordering
    • Swizzles are written with a λ followed by a list of letters
    • Capital letters fix ¤ the corresponding value
    • The λ formats from ' when it is in front of the letters
  • Add experimental array swizzles, which allow extracting rows from an array in a concise way
    • Swizzles are written with a followed by a list of letters
    • Letters up to m start from the first row, Letters back from z start from the last row
    • Capital letters un ° box □ the corresponding value
    • The formats from '' when it is in front of the letters
  • keep ▽ now works with un °
    • It splits an array into counts and an adjacent deduplication
  • Add the json function, which encodes and decodes JSON strings
  • Add the xlsx function, which encodes and decodes XLSX data
  • bits ⋯ can now take negative numbers
  • un ° bits ⋯ can now take non-booleans
  • Add un ° duplicate . pattern matching
  • Add un ° min ↧ and un ° max ↥ pattern matching
  • insert can now be used with un ° to extract a map entry and pattern match it
  • fill ⬚ed keep ▽'s fill value may now be a list
  • infinity ∞ can now be passed in a list to take ↙ or drop ↘ to take/drop every row along an axis
  • reduce / can now take a function with more than 2 arguments
    • Each additional argument increases the number of arguments passed to reduce / by 1
    • Additional arguments are passed to the function on every iteration
  • try ⍣ signature checking is now more permissive
  • Switch function signature checking is now more permissive with branches that have an assert ⍤ that always triggers
  • first ⊢, first ⊢ reverse ⇌, rise ⍏, and fall ⍖ can now be used on scalars
  • Add the &exit system function, which exits the program with a status code
  • Add the experimental &memcpy system function, which copies the data from &ffi pointers to an array
  • Add the experimental &memfree system function, which frees memory allocated by &ffi functions
  • Add &tlsc and &tlsl system functions, which allow making TLS connections
    • &tlsc replaces &httpsw, which is now deprecated
    • &tlsl is currently experimental and mostly untested
  • &rs will now attempt to read additional bytes to resolve a UTF-8 character
  • &gife and &gifs now support binary transparency
  • Signatures can now be specified in stack array notation immediately after a [ or {
  • Change how long decimal numbers are formatted
    • Sequences of repeated digits are now replaced with
  • Add argument documentation comments
  • Add some useful shadowable constants for working with compile-time file paths
    • ThisFile - The relative path of the current source file
    • ThisFileName - The name of the current source file
    • ThisFileDir - The directory of the current source file
    • WorkingDir - The compile-time working directory
  • Deprecate function strands
    • They ended up making code less readable
  • Remove previously deprecated primitives:
    • this ↬
    • recur ↫
    • all ⋔
    • cascade ⪾
    • bind λ
    • types
    • shapes
  • Remove several backward compatible glyphs from the lexer
    • This frees up some glyphs that can now be used as function names

Interpreter

  • Lots of optimizations
  • setinv now emits a warning if the functions do not have opposite signatures
  • Add the --io flag to the uiua fmt command, which formats code from stdin to stdout
  • Lots of bug and crash fixes

Website

  • Add a Documenting Code tutorial
  • Add a Files and Streams tutorial
  • Add an Experimental Features page
  • Rewrite the pad code to use a <textarea> rather than a contenteditable <div>
    • This should make it work better in more browsers, especially on mobile
  • You can now ctrl+click on a glyph in the editor to open its documentation

0.10.3 - 2024-04-09

Interpreter

  • Fix a crash involving pervasive operations on some 0-length arrays

0.10.2 - 2024-04-08

Interpreter

0.10.1 - 2024-04-07

Interpreter

  • under ⍜ of pattern matching now works correctly
  • under ⍜ un ° scan \\ now works correctly
  • Style and advice diagnostics are no longer emitted from macros

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 functions insert, has, get, and remove 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
  • 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 change
  • un ° scan \\ now works with equals = and not equals ≠
  • group ⊕ can now take multidimensional index arrays
  • partition ⊜ can now take multidimensional marker arrays
  • under ⍜ select ⊏ and pick ⊡ now work with duplicate indices if the values at those indices are the same
  • rotate ↻ now works through boxes
  • fold ∧ now works with under ⍜ if its function does
  • inventory ⍚ can now take 3 or more arrays
  • repeat ⍥ 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 with un ° to separate into classify ⊛ and deduplicate ◴ (changed in 0.12.0)
  • Characters can now be multiply ×d or divide ÷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 for dip ⊙ fix ¤
  • Existing macros are now called "stack macros" to distinguish them from the new "array macros"
  • 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
  • un ° pop ◌ can now be used to retrieve the fill ⬚ value
    • See more details in fill ⬚'s documentation
  • 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 index
  • 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
    • It undermines the principles of the language
    • It makes certain optimizations impossible
    • fill ⬚ and/or map can be used to achieve similar effects
  • Deprecate deal
    • It is rarely used and easy to express with other functions
  • Deprecate experimental shapes and types 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 the uiua 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
  • Lots of bug and crash fixes

Website

  • Tutorials
  • 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 with Ctrl+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 - 2024-02-28

Interpreter

  • Fix a crash in each ∵ of 3 or more arrays

0.9.4 - 2024-02-28

Interpreter

  • Fix a bug with filled multi-dimensional take ↙
  • Fix a crash in rows ≡ of 3 or more arrays

0.9.3 - 2024-02-27

Interpreter

  • Fix a major bug with negative take ↙

0.9.2 - 2024-02-25

Interpreter

  • Fix a bug involving patterns like °°[…]

0.9.1 - 2024-02-25

Crate

  • Improve Rust library API for getting bindings' values

0.9.0 - 2024-02-25

Language

  • Breaking Change - repeat ⍥ with infinity ∞ now does a fixed-point iteration rather than an infinite loop
    • You can still do an infinite loop with do ⍢(…)1
  • 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 ∞
  • Breaking Change - &ad and &imd now return an encoding format as a string in addition to the media data
    • They are also now deprecated in favor of using un ° with &ae or &ime
  • Overhaul the module system
    • Details can be found in the updated Modules tutorial
    • Deprecate &i, as it is no longer necessary
    • Enabling experimental allows a module path of the form git: <repo url> to load a module from a git repository
  • 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 common fork ⊃ pattern in a more readable way
  • join ⊂ can now be used with under ⍜
    • This only works when the joined arrays have different ranks
  • join ⊂ can now be used with un ° to separate the first row of an array from the rest
  • try ⍣'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
  • fill ⬚ can now match the lengths of inputs to rows ≡
  • Add recursion via referring to a binding's name within its body
  • Extend some math functions to work with characters
  • range ⇡ can now be used with negative numbers
  • eta η, pi π, tau τ and infinity ∞ are now parsed as numbers rather than functions
    • This lets them syntactically bind with ¯ or form fraction literals
  • 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 with inventory ⍚. Code using will continue to work and will be formatted as .
  • content ◇ can now be used with under ⍜ 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 for fork ⊃
  • 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 with under ⍜
    • This is only useful when pop ◌ is composed with other functions
  • Breaking Change - Flip the order of send's arguments
  • Add the pool modifier, which is identical to spawn but spawns a thread in a thread pool
  • &rs can now take a count of infinity ∞ 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
    • FFI is still a work in progress, but it is currently useful for foreign functions that aren't too complex
    • Bindings for Raylib are being worked on as a proof of concept. You can find them in the rayua repository.
  • 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
  • Add experimental shapes and types 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
    • Optimize the pattern for adjacency: /F
      • It is as much as 800x faster in some cases
    • Optimize /
    • Square matrices are now transposed in-place
    • ..and more
  • Numbers that seem to have a floating-point epsilon rounding error will be output with the epsilon noted
  • Language Server
    • Add completions
    • Add diagnostics
    • Add semantic highlighting
    • Add inline function hovering
    • Show un °/under ⍜ compatibility for user-defined functions

Website

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 with unique ◰. Code using will continue to work and will be formatted as .
  • 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 for reduce /, group ⊕, and partition ⊜
    • Breaking Change - Reducing group ⊕ and partition ⊜ 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 - Most non-pervasive monadic functions no longer implicitly unbox their argument
    • This implicitness led to some unexpected behavior, particularly when getting the length ⧻ or shape △ of a boxed array
    • Exceptions are reverse ⇌ and transpose ⍉, which work on box elements without unboxing them
  • Unicode escape sequences that are not 2 or 4 hex digits 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 number
  • classify ⊛ and deduplicate ◴ now work with under ⍜
  • &fras and &frab now work with under ⍜
  • 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

0.7.1 - 2023-12-18

Interpreter

  • Fix some bugs and crashes

0.7.0 - 2023-12-15

Language

  • An entire Uiua codebase is now compiled before it is executed, rather than compiling and executing line-by-line
  • Add the memo modifier, which memoizes a function
  • Add the comptime modifier, which runs a function at compile time
  • &i can now only be used as the first function in a binding
  • repeat ⍥ can no longer use a negative number of repetitions
  • repeat ⍥ can now be used with un ° and under ⍜
  • reshape ↯ now works with under ⍜
  • scan \ now works with un ° in some cases
  • setinv and setund are no longer experimental
  • Add output comments, which the formatter fills with values from the stack
    • Make an empty comment starting with n additional #s
    • The formatter will replace the comment with the top n values from the stack
    • Output comments in functions will show a number of values present on the stack for each time the function is called

Interpreter

  • LSP improvements
    • Add hover information on binding references
    • Add signatures to binding hover information
    • Add same-file binding rename support
    • Add same-file goto definition support
  • Add the uiua build command, which emits a .uasm bytecode file
  • uiua run can now run a .uasm bytecode file
  • uiua stand now embeds the bytecode assembly in the executable
  • Multiple compiler errors can now be emitted at once
  • Bug and crash fixes
  • Performance improvements

Website

  • Add an Inverses tutorial
  • Each tutorial challenge now contains 1 or 2 answers

0.6.1 - 2023-12-07

Interpreter

  • Make proxy values a little less leaky
  • Make placeholders work properly with both ∩
  • Some other bug and crash fixes

0.6.0 - 2023-12-06

Language

  • fix ¤ now works with binary pervasive functions
    • This removes the need for some uses of rows ≡ and should be a bit faster
  • fill ⬚ can now be disabled for a function by filling with an empty list
  • parse ⋕ now has a glyph and is semi-pervasive
    • It was being used enough to warrant a glyph
  • sign ±, floor ⌊, ceiling ⌈, and round ⁅ now work with under ⍜
  • Add some missing arithmetic inverses and unders involving flip :
  • Change pack's name to unpack ⊐, and it no longer implicitly boxes values (only unboxes them)
    • Implicit boxing could lead to unexpected and inconsistent behavior
  • Change invert's name and glyph to un °. Code using will continue to work and will be formatted as °.
    • ° is a nicer glyph, and un composes more nicely with the names of invertible functions
  • Deprecate unbox ⊔ in favor of un ° box □
    • It can still be typed the same way!
  • Deprecate reduce / with a monadic function
    • This created poorly-defined stack signatures that changed depending on the length of the array being reduced
    • un ° with stack array and planet notations, i.e. °[⊙⊙∘], can be used instead, as it has a well-defined signature
    • For operating on just part of an array, use under ⍜ take ↙, drop ↘, or select ⊏
  • box □ed arrays can once again be compared lexicographically

Interpreter

  • Make stack ? and dump output show call stack
  • Show type and shape information when pretty-printing empty arrays with rank 2 or greater
  • Improve language server hover information
  • Bug and crash fixes

Website

  • Add a token count to the editor (in settings)
  • Files can now be dragged into the editor to open them with &fras
  • &fld now works on the website

0.5.1 - 2023-12-02

Interpreter

0.5.0 - 2023-12-02

Language

  • invert ⍘ and under ⍜ now work with stack array notation.
  • Add the stack ? function, which debug-prints the entire stack
  • dump now works with invert ⍘ and under ⍜
  • fill ⬚ and pack ⊐ are now exclusive
  • Change how regex works to be more powerful
  • Add special syntax for splitting/joining lines of code
    • ' will split a line without changing semantics
    • '' will combine two lines without changing semantics
  • The way pervasive functions work with box □ed arrays is now more consistent
  • Remove reach, distribute, tribute, level, combinate, and all ocean functions for good

Interpreter

  • Add a style diagnostic about lines that are too long
  • Add some other style diagnostics
  • Replace uiua check-update with uiua update, which will update the interpreter by installing a new version with Cargo
  • Bug and crash fixes

Website

  • Multiline strings can now be toggled like comments with ctrl+4

0.4.1 - 2023-11-30

Interpreter

  • Fix a bug with nested custom modifiers

0.4.0 - 2023-11-30

Language

  • windows ◫ can now take negative window sizes
  • Add an experimental distinction for some functions/modifiers
    • Experimental features are opt-in and must be enabled by putting an # Experimental! comment at the top of a file
  • Add the experimental all ⋔ modifier, which is a variadic generalization of both ∩
  • Add the experimental rectify ⌅ modifier, which sets a function's inverse to itself
  • Add the experimental setinv modifier, which sets the inverse of a function
  • Add the experimental setunder modifier, which sets the under ⍜-compatible inverse of a function
  • Add the experimental this ↬ modifier, which sets a function to recur to
  • Add the experimental recur ↫ modifier, which calls a function recursively
  • Allow custom modifiers to use switch function syntax
  • sign ± now normalizes complex numbers
  • Change type mapping
  • Deprecate reach ⟜

Interpreter

  • Fix some bugs and crashes
  • Improve some formatting with multiline functions and switch functions
  • identity ∘ no longer formats from ()
  • Allow uiua <file> [args] as a shortcut for uiua run <file> [args]

Website

  • Allow disabling autorun for pad links

0.3.1 - 2023-11-20

Interpreter

  • Fix some bugs and crashes

0.3.0 - 2023-11-19

Language

  • Big Change
    • Deprecate all ocean functions
    • Deprecate level ≑ and combinate ◳
    • Deprecate tribute ≐ and distribute ∺
    • fold ∧ no longer takes a rank list
  • Add the rerank ☇ function, which changes the rank of an array's rows
    • This fills the void left by level ≑ and combinate ◳
  • Add the fix ¤ function, which adds a length 1 axis to an array
  • rows ≡ now repeats the rows of an arrays that have exactly 1 row
    • This in combination with fix ¤ fills the void left by tribute ≐ and distribute ∺
  • cross ⊠ can now take more than 2 arguments
  • Switch functions are now less strict about branch signature compatibility and can take arrays as conditions
  • A single switch function can now be used as a list of functions for dyadic modifiers
  • Remove if ?, as all its use cases are now covered by switch functions. It will continue to parse, but ?ab will be formatted as (b|a)
  • flip :'s glyph is now just a colon (it was RATIO ∶)
  • under ⍜ now works with absolute value ⌵
  • Remove break ⎋ for good

Interpreter

  • Lots of bug and crash fixes
  • Lots of performance improvements

Website

0.2.0 - 2023-11-09

Language

Interpreter

  • Fix a bunch of bugs
  • Several performance optimizations
    • transpose ⍉ is now much faster
    • distribute ∺ and tribute ≐ are now much faster if their function is a pervasive built-in
    • Some other functions are also a bit faster

Website

  • Hold shift when copying a link to copy a Markdown link
  • Add embeddable editor. Replace the pad in pad links with embed or embedpad.

0.1.0 - 2023-11-03

Language

  • Add complex numbers, which can be created with the complex ℂ function
  • Add the do ⍢ modifier, which repeatedly calls a function as long as a condition holds
  • Deprecate break ⎋
  • Add multi-dimensional where ⊚
  • join ⊂ to an empty list now always works regardless of rank of the other array
  • each ∵ and rows ≡ now work with under ⍜
  • All ocean functions now work with under ⍜
  • Allow multiple values to be returned from each ∵, rows ≡, distribute ∺, tribute ≐, table ⊞, and cross ⊠
  • invert ⍘ atangent ∠ now produces the sine and cosine of an angle
  • &i now treats paths as relative to the file calling it rather than the current working directory
  • Rank list functions for the rank-generic modifiers can now take any number of arguments. For any number of augments greater that 0, an empty numeric list will be pushed before the function is called.
  • Add fraction literals with /
  • Parsing multiple formattable functions from words is now smarter
  • Remove bind '. It made code hard to read. It will continue to parse, but will be formatted as (…)

Interpreter

  • Add the uiua stand command, which creates a standalone executable

Website

0.0.25 - 2023-10-29

Interpreter

  • Fix a bug with watch mode

0.0.24 - 2023-10-29

Language

  • Add the reach ⟜ modifier, which removes the second value from the stack and calls its function.
  • Change how short spellings of dip ⊙, gap ⋅, and identity ∘ work
    • Instead of allowing them to be spelled with 2 characters, they can now be spelled with 1 character as long as there are at least 2 in the sequence.
    • If present, 'i' may only come last.
    • reach ⟜ is included.
  • Add 2-letter spellings of deep ≊, abyss ≃, and seabed ∸ to make them consistent with rock ⋄.

Interpreter

  • Fix a bunch of bugs and crashes
  • The formatter now indents bindings that start with a bound function that starts with &i
  • The native interpreter no longer automatically checks for updates. You can still check manually with uiua update?.

Website

Crate

0.0.23 - 2023-10-25

Language

Interpreter

  • The interpreter now formats its own diagnostic messages instead of delegating to a library
  • Fix a bunch of bugs and crashes
  • Add uiua repl command
  • Optimize (), (), (), and () to be O(n) instead of O(nlogn)
  • Optimize () to not materialize the indices array

Website

  • &ast now works on the website by generating a fixed amount of audio
    • How long the generated audio is can be configured in the editor settings
  • Error and diagnostic messages are no-longer all one color
  • The pad editor now inserts a trailing newline on format
  • Increase thresholds for arrays automatically becoming images or audio
  • Split up system functions into more categories on the main docs page
  • The bell character @\b now plays a sound if printed with &p or &pf

Community

0.0.22 - 2023-10-21

Language

  • Custom modifier placeholders (^) must now be immediately followed by a signature. This reduces the number of signatures that have to be declared everywhere else.

0.0.21 - 2023-10-21

Language

  • Massive Change - Functions are no longer first-class values. This has many implications:
    • Functions can no longer be put in arrays or manipulated as stack values
    • Inline functions can now only appear as modifier arguments or bindings
    • call ! has been removed, as there is nothing on the stack to call
    • Modules have been reworked. &i now handles both loading a module from a file and importing items from that module.
    • --- scopes are now test scopes. ~~~ scopes have been removed.
    • Remove use, as it is no longer necessary
    • Boxes still work as normal, but are now their own type distinct from functions
    • Remove sig, as everything that can be on the stack now has the same signature
  • Add new syntax for defining custom modifiers
  • Add new syntax for calling a function from a list of functions
  • Add the pack ⊐ modifier, which calls its function and implicitly boxes/unboxes values
  • Add the combinate ◳ modifier, which is a rank-generic version of table ⊞
  • fold ∧ is now rank-generic and requires a rank list
  • Add the tribute ≐ modifier, which is a flipped version of distribute ∺
  • Change level ≑'s glyph to reflect its relationship with each ∵, rows ≡, distribute ∺, and tribute ≐. Code using will continue to work and will be formatted as .
  • Add rock ⋄, surface ~, deep ≊, abyss ≃, and seabed ∸, which build rank lists to be used with level ≑ and the new rank-generic modifiers
  • Change trace ⸮'s glyph to let surface ~ use ~.
  • Change match ≍'s glyph to avoid confusion with the new ocean functions' glyphs. Code using will continue to work and will be formatted as .
  • Stack signatures found to be incorrect at runtime produce an error
  • Dyadic math operations now work with under ⍜ even if both arguments are outside under ⍜'s function
  • Some mathematical functions that previously did not work with invert ⍘ and under ⍜ when accompanied by flip : now do

Website

0.0.20 - 2023-10-16

Language

  • Add regex function for matching regular expressions
  • Add utf function for UTF-8 encoding and decoding
  • Add &invk system function for invoking a path to be opened with the system's default program
  • fill ⬚ can now be used with first ⊢
  • Most functions that expect strings as arguments will now dig arbitrarily deep into boxes
  • Make if ? signature checking more permissive
  • The presence of break ⎋ in a repeat ⍥ always requires a stack signature
  • The &runi and &runc functions now return exit codes
  • Multiline string now only insert \n at the end of each line instead of \r\n

Interpreter

  • Bugfixes and performance improvements

Website

0.0.19 - 2023-10-13

Language

  • Add under ⍜ both ∩
  • Remove restack ⇵ for good
  • Remove roll ↷ and unroll ↶ for good
  • @\s can now be used in addition to @ to get a space character

Interpreter

  • Many performance improvements and memory usage reductions
  • Many bug and crash fixes
  • Add some additional style diagnostics
  • Add more semantic token types to the language server
  • Stop using deprecated MarkedString in the language server

Website

  • The editor's font size can now be changed
  • Improve brackets/quotes behavior in the editor
  • HTML is now properly escaped in the editor
  • Formatting can now put the cursor to the left of the current token (toggleable in the settings)

0.0.18 - 2023-10-10

Language

  • Major Change distribute ∺ now takes the array being distributed as its last argument, rather than its first
  • Add where ⊚ function, which returns the indices of an array that have non-zero values
  • if ?'s branches can now have a different number of arguments (but not outputs)
  • if ?'s condition can now be a list of conditions, and the branch will be chosen for each row in the argument(s)
  • The reducing versions of group ⊕ and partition ⊜ now take accumulators. Aggregating versions are unchanged.
  • spawn and wait no longer have glyphs. Code using and will continue to work and will be formatted as spawn and wait.
  • &n is no longer a system function and is now called now
  • under ⍜ now can be used to time things
  • call ! can now call functions that return any number of values, not just one
  • Add hex character escape sequences for string and character literals.
    • \xNN for short ASCII codes
    • \uNNNN for full Unicode sequences

Interpreter

  • The formatter now aligns consecutive end-of-line comments
  • NaNs no longer propagate in minimum ⌊ and maximum ⌈
  • Fix a bug that prevented under ⍜ multidimensional take ↙ and drop ↘ from working
  • Fix a bug in how fold ∧ ordered multiple accumulators
  • Fix a bug that allowed incorrect signatures to be declared for functions
  • Fix a bunch of other bugs and crashes

Website

  • Add the Uiua386 font as an option in the editor

0.0.17 - 2023-10-07

Language

  • Add GIF encoding with &gife
  • Rename constant to box □.
  • Add unbox ⊔, which unboxes a boxed array
  • Major Change: Some uses of call ! will no longer compile without declaring a stack signature. When unboxing box □ed arrays, you can use unbox ⊔ instead, which has a well-defined signature.
  • Add fall ⍖ function, which gives the indices of the array if it were sorted descending
  • Change grade ⌂ name and glyph to rise ⍏ to reflect its relationship with fall ⍖. Code using will continue to work and will be formatted as .
  • try ⍣ now puts arguments to its first function above the error value when calling the error handler
  • fold ∧ can now use multiple accumulators
  • Improve dump output formatting
  • dump is now a monadic modifier. Its function preprocesses each value before dumping it.
  • Add the sig function, which returns the stack signature of a value
  • A negative dimensions in the shape passed to reshape ↯ can now be in any position, not just the first or last
  • Functions with ASCII glyphs now also format from their names
  • Add a advice diagnostic about the capitalization of binding names

Interpreter

Website

  • Add GIF output
  • Execution time limit is now 2 seconds by default but can be customized

0.0.16 - 2023-10-05

Interpreter

  • Fix a crash and a bug that could occur when creating nested arrays that pull in values.

0.0.15 - 2023-10-05

This version changes a lot of glyphs. If you are coming from the previous version, most of the old glyphs will be automatically formatted to the new ones. The only change you may need to make is replacing all ^s with |s.

You may want to read the new version of the Advanced Stack Manipulation Tutorial to understand the reason for so many of these changes.

Language

  • Add the bracket ⊓ modifier, which calls two functions each on different arguments
  • Change fill ⬚'s glyph to reflect its relationship with box □. Code using with continue to work and will be formatted as .
  • Change share ⇉ name and glyph to fork ⊃. Code using will continue to work and will be formatted as .
  • Change noop · name and glyphs to identity ∘ to reflect its relationship with gap ⋅ and dip ⊙. Code using · will continue to work and will be formatted as .
  • Change identity ∘'s signature from |0.0 to |1.1
  • Add the gap ⋅ modifier, which discards a value then calls its function. It is mainly intended to be used with fork ⊃.
  • Change dip ⊙'s glyph to reflect its relationship with gap ⋅ and identity ∘. Code using will continue to work and will be formatted as .
  • Change both ∩'s glyph to reflect its relationship with fork ⊃. Code using will continue to work and will be formatted as .
  • distribute ∺ now works with any number of arguments. Only the first argument is distributed.
  • fill ⬚ now works with reshape ↯
  • reshape ↯ now allow negative numbers to denote derived dimensions
  • Change the modifier termination character to | instead of ^
  • Remove old versions of fork and trident
  • Add the &httpsw function for making HTTPS requests

Interpreter

  • Add formatter configuration options. See the readme for details.
  • Checking for updates is less zealous, and can be disabled with the --no-update flag to uiua run or uiua watch

Website

  • Running code in the Pad editor updates the URL to prevent work from accidentally being lost

Pre-Version Updates

2023-10-03

Language

  • Add the share ⊃ modifier, which unifies and deprecates fork ⊃ and trident ∋
  • bind ' no longer calls its functions immediately. This should not change any reasonable existing code.
  • Change how partition ⊜ and group ⊕ work with dyadic functions to be consistent with reduce /
  • Deprecate restack ⇵. It was never a good idea.
  • Remove the overloaded behavior of call !. It no longer behaves like an if-else when used with a list of functions.
    • You can replace all existing instances of that use case with !⊡:
  • Add the if ? modifier, which calls one of two functions based on a condition

2023-10-02

Language

  • both ∩ can now be used with a function that takes any number of arguments.
  • Various bug and crash fixes

Interpreter

  • Tell the user when the interpreter can be updated

2023-10-01

  • Add the dip ⊙ modifier, which temporarily pops a value
  • Deprecate roll↷ and unroll↶
  • Add under ⍜ keep ▽
  • Add dump function, which prints the entire stack

2023-09-30

Language

  • Remove the |1.1 signature restriction for under ⍜'s second function
  • Remove the rank function
  • Remove the restriction that all functions in a non-scalar function array all have the compatible signatures
  • Whether a binding is a constant or a function is now independent of how many values are on the stack
  • Add a system for non-error diagnostics
    • Add advice about redundant uses of each ∵

Interpreter

  • Allow passing --no-format to uiua watch
  • &sc now returns 0 if EOF is input

Website

  • &sc now works on the website by showing a prompt

2023-09-29

Language

  • Make binding names case-sensitive
  • Add ^ syntax to terminate modifier parsing.
  • Add &runi and &runc functions for running commands
  • Add &cd function for changing the current working directory
  • Add shadowable constants like e and os
  • Change trident ∋ argument order to make it easier to reason about
  • Enable fill ⬚ for keep ▽ if the amount list is shorter than the kept array

Interpreter

  • Add uiua eval command which evaluates a Uiua expression and prints the result
  • Watch commands no longer try to open the file being watched
  • Fix a bug that made numbers that were ≤ 1e-12 ⌵ format to 0

Website

  • Make a space character @ more visible by underlining the space
  • Improve cursor movement when formatting in the editor

2023-09-28

Language

  • Add this changelog
  • Add trace ~ function
    • Debug-prints the value on top of the stack without popping it
    • Shows the line and column number too
  • Add both ∩ modifier
    • This can change code like /(|2 ⊂!:!:) {"a" "bc" "def"}
    • To just /'⊂∩! {"a" "bc" "def"}
  • Turn the term pair syntactic construct into a modifier called bind '

Interpreter

  • Fix some correctness bugs related to under ⍜ and invert
  • Fix a crash when trying to reverse an empty array

Website