Expand description
The Uiua programming language
This is the crate so you can use Uiua as a Rust library. If you just want to write programs in Uiua, you can check out uiua.org or the GitHub repo.
§Usage
The uiua
crate is set up primarily to be installed as a binary. For this reason, when using it as a library, you’ll likely want to disable default features.
This disables some of the features that many users are used to having, so to re-enable things like regex and media encoding, you can enable the batteries
feature.
# Cargo.toml
[dependencies]
uiua = { version = "*", default-features = false, features = ["batteries"] }
The main entry point is the Uiua
struct, which is the Uiua runtime. It must be created with a SysBackend
. Uiua::with_native_sys
is a convenient way to create a Uiua runtime that uses the same backend as the Uiua CLI, though keep in mind it gives full access to the filesystem and TCP sockets and so probably shouldn’t be used in a sandboxed environment.
Value
is the generic value type. It wraps one of five Array
types.
You can run Uiua code with Uiua::run_str
or Uiua::run_file
.
use uiua::*;
let mut uiua = Uiua::with_native_sys();
uiua.run_str("&p + 1 2").unwrap();
You can push values onto the stack with Uiua::push
. When you’re done, you can get the results with Uiua::pop
, Uiua::take_stack
, or one of numerous pop+conversion convenience functions.
use uiua::*;
let mut uiua = Uiua::with_native_sys();
uiua.push(1);
uiua.push(2);
uiua.run_str("+").unwrap();
let res = uiua.pop_int().unwrap();
assert_eq!(res, 3);
Sometimes, you need to configure the compiler before running.
You can create a new compiler with Compiler::new
. Strings or files can be compiled with Compiler::load_str
or Compiler::load_file
respectively.
You can get the compiled assembly with Compiler::finish
and run it with Uiua::run_asm
.
use uiua::*;
let mut comp = Compiler::new();
comp.print_diagnostics(true);
let asm = comp.load_str("+ 3 5").unwrap().finish();
let mut uiua = Uiua::with_native_sys();
uiua.run_asm(&asm).unwrap();
let res = uiua.pop_int().unwrap();
assert_eq!(res, 8);
This can be shortened a bit with Uiua::compile_run
.
use uiua::*;
let mut uiua = Uiua::with_native_sys();
uiua.compile_run(|comp| {
comp.print_diagnostics(true).load_str("+ 3 5")
});
You can create and bind Rust functions with Compiler::create_function
, Compiler::bind_function
, and Compiler::create_bind_function
use uiua::*;
let mut comp = Compiler::new();
comp.create_bind_function("MyAdd", (2, 1), |uiua| {
let a = uiua.pop_num()?;
let b = uiua.pop_num()?;
uiua.push(a + b);
Ok(())
}).unwrap();
comp.load_str("MyAdd 2 3").unwrap();
let asm = comp.finish();
let mut uiua = Uiua::with_native_sys();
uiua.run_asm(asm).unwrap();
let res = uiua.pop_num().unwrap();
assert_eq!(res, 5.0);
Bindings can be retrieved with Uiua::bound_values
or Uiua::bound_functions
.
use uiua::*;
let mut uiua = Uiua::with_native_sys();
uiua.run_str("
X ← 5
F ← +1
").unwrap();
let x = uiua.bound_values().remove("X").unwrap();
assert_eq!(x.as_int(&uiua, "").unwrap(), 5);
let f = uiua.bound_functions().remove("F").unwrap();
let mut comp = Compiler::new().with_assembly(uiua.take_asm());
comp.create_bind_function("AddTwo", (1, 1), move |uiua| {
uiua.call(f.clone())?;
uiua.call(f.clone())
}).unwrap();
comp.load_str("AddTwo 3").unwrap();
uiua.run_asm(comp.finish()).unwrap();
let res = uiua.pop_int().unwrap();
assert_eq!(res, 5);
You can format Uiua code with the format
module.
use uiua::format::*;
let input = "resh3_4rang12";
let config = FormatConfig::default().with_trailing_newline(false);
let formatted = format_str(input, &config).unwrap().output;
assert_eq!(formatted, "↯3_4⇡12");
§Features
The uiua
crate has the following noteable feature flags:
batteries
: Enables the following features:regex
: Enables theregex
functionimage
: Enables image encoding and decodinggif
: Enables GIF encoding and decodingaudio_encode
: Enables audio encoding and decoding
native_sys
: Enables theNativeSys
backend. This is the default backend used by the interpreter.audio
: Enables audio features in theNativeSys
backend.https
: Enables the&httpsw
system functioninvoke
: Enables the&invk
system functiontrash
: Enables the&ftr
system functionraw_mode
: Enables the&raw
system function
Re-exports§
Modules§
- Uiua’s abstract syntax tree
- En/decode Uiua arrays to/from media formats
- The Uiua formatter
- Uiua’s Language Server Protocol (LSP) implementation
Macros§
- Operate on a value as an array
Structs§
- Uiua’s array type
- Flags for an array
- Non-shape metadata for an array
- A compiled Uiua assembly
- Information about a binding
- The element type for box arrays
- A span in a Uiua source file
- The Uiua compiler
- Uiua’s complex number type
- The definition of a shadowable constant
- A message to be displayed to the user that is not an error
- A comment that documents a binding
- An argument in a doc comment signature
- A signature in a doc comment
- A function that executes Rust code
- A wrapper that nicely prints a
Primitive
- A formattable shape
- A range of compiled instructions
- A Uiua function
- A handle to an IO stream
- A repository of code strings input to the compiler
- A location in a Uiua source file
- The index of a named local in the bindings, and whether it is public
- Array pointer metadata
- A Uiua module
- The default native system backend
- Array metadata that can be persisted across operations
- Documentation for a primitive
- An primitive code example
- The names of a primitive
- A rich-text error/diagnostic report
- A safe backend with no IO other than captured stdout and stderr
- Uiua’s array shape type
- A function stack signature
- A span wrapping a value
- A frame in a trace
- The Uiua interpreter
- An error produced when running/compiling/formatting a Uiua program
Enums§
- An ASCII lexical token
- A kind of global binding
- Kinds of shadowable constants
- The value of a shadowable constant
- Kinds of non-error diagnostics
- Types for FFI
- A Uiua function id
- A target for a git repository
- The kind of a handle
- The source of code input into the interpreter
- A Uiua bytecode instruction
- An error that occurred while lexing
- An error that occurred while parsing
- The mode that dictates how much code to pre-evaluate at compile time
- Categories of primitives
- A pseudo-markdown fragment for primitive documentation
- A line in a primitive’s documentation
- A built-in function
- Levels of purity for an operation
- A text fragment of a report
- Kinds of reports
- A mode that affects how non-binding lines are run
- The kinds of semantic comments
- A runtime span in a Uiua source file
- A system function
- Categories of system functions
- A type of temporary stacks
- A Uiua lexical token
- The kind of an error produced when running/compiling/formatting a Uiua program
- A generic array value
Constants§
- The text of Uiua’s example text file
- The text of Uiua’s example module
- Subscript digit characters
- The Uiua version
- A character value used as a wildcard that will equal any character
- A NaN value that always compares as equal
Statics§
- The list of all shadowable constants
- Default metadata for an array
Traits§
- Trait for comparing array elements
- A trait for types that can be used as array elements
- A combination of
ExactSizeIterator
andDoubleEndedIterator
- A trait for types that can be converted into an
InputSrc
- Trait for converting to a system backend
- Trait for
ArrayValue
s that are real numbers - A trait for types that can be used as argument specifiers for
Uiua::pop
- Trait for defining a system backend
Functions§
- Access the built-in
example.txt
file - Access the built-in
example.ua
file - Get the number of modifier arguments implied by an identifier
- Whether a string is a custom glyph
- Whether a character can be part of a Uiua identifier
- Whether a character can be among the first characters of a Uiua identifier
- Lex a Uiua source file
- Get the current time in seconds
- Parse Uiua code into an AST
- Generate a random number, equivalent to
Primitive::Rand
- Seed the random number generator
Type Aliases§
- The function type passed to
&ast
- A Uiua identifier
- Uiua’s result type