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
- The Uiua formatter
- Uiua’s Language Server Protocol (LSP) implementation
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 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
- An imported module
- A repository of code strings input to the compiler
- A location in a Uiua source file
- The defualt 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
Enums§
- An ASCII lexical token
- A kind of global binding
- Kinds of non-error diagnostics
- Types for FFI
- A Uiua function id
- 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
- 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
- An error produced when running a Uiua program
- A generic array value
Constants§
- 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 trait for ArrayValue types that can be debug formatted
- A combination of
ExactSizeIterator
andDoubleEndedIterator
- A trait for types that can be converted into an
InputSrc
- Trait for converting to a system backend
- 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.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
- Lex a Uiua source file
- Parse Uiua code into an AST
- Generate a random number, equivalent to
Primitive::Rand
Type Aliases§
- The function type passed to
&ast
- A Uiua identifier
- Uiua’s result type