5266 lines
144 KiB
Markdown
5266 lines
144 KiB
Markdown
# Stack Language Specification
|
|
|
|
**Version**: 0.8.2
|
|
**Status**: Draft Specification
|
|
**Changes**:
|
|
- 0.5 (AI)
|
|
1. **Escape sequences** - Added a complete list of escape sequences for string literals
|
|
2. **Type Tuples** - Defined them as function signatures representing stack effects
|
|
3. **Control flow TokenStrings** - Clarified that `if`, `while`, `match`, etc. use TokenStrings
|
|
4. **Generic constructs** - Clarified that generics need trait constraints when operations are performed
|
|
5. **Stack manipulation traits** - Combined into a single `Stackable` trait
|
|
6. **Size trait** - Added proper definition inheriting from `Addable`, `Comparable`, and `Convertible`
|
|
7. **Empty traits** - Clarified that traits can be empty (especially when used with inheritance)
|
|
8. **Trait inheritance** - Fixed syntax to require both `inher` and `trait` declarations
|
|
9. **Array combinators** - Clarified that the functions inside parse their TokenStrings
|
|
10. **`::` in TokenStrings** - Clarified it should NOT be used in trait/impl contexts
|
|
- 0.5.1 (Human)
|
|
1. Created TODOs
|
|
2. Made various corrections (not everything was corrected)
|
|
3. Reviewed and corrected some code blocks
|
|
4. Made a few adjustments manually
|
|
- 0.6 (AI)
|
|
1. **Operator descriptions** - Added natural language descriptions for all built-in operators
|
|
2. **Operators vs Functions** - Clarified distinction and naming rules
|
|
3. **Generic trait syntax** - Documented `<>` syntax for generic traits
|
|
4. **Generic trait inheritance** - Clarified rules for inheriting from generic traits
|
|
5. **Code block types** - Distinguished actual language definitions from examples
|
|
6. **Trait appendix** - Created comprehensive trait definitions appendix
|
|
7. **TokenString contexts** - Listed all control flow operators and their parsing behavior
|
|
8. **Lambda operator** - Added specification for lambda operator
|
|
9. **Type parameter enforcement** - Documented current parsing behavior
|
|
10. **Identifier literal requirements** - Specified `::` rules for different contexts
|
|
11. **Trait implementation rules** - Clarified implementation semantics
|
|
12. **Type conversions** - Changed to explicit conversion functions
|
|
13. **Memory management** - Moved to appendix as future feature
|
|
14. **Module system** - Added appendix entry for future imports
|
|
15. **Examples section** - Moved to appendix
|
|
16. **Syntax summary** - Moved to appendix and expanded
|
|
- 0.6.1 (AI)
|
|
1. **Variadic arguments** - Decision: Use array syntax for variable arguments (no special variadic syntax yet)
|
|
2. **Inheritance before trait** - Decision: Yes, inheritance declarations must come before trait definition
|
|
3. **`inher` operator** - Decision: No, merge inheritance into trait operator (removed `inher`)
|
|
4. **Separate `inher` vs `impl`** - Decision: Keep them separate (impl is for implementations only)
|
|
- 0.6.2 (Human)
|
|
1. Created TODOs
|
|
2. Made various corrections (not everything was corrected)
|
|
3. Reviewed and corrected some code blocks
|
|
4. Made a few adjustments manually
|
|
5. Reversed removing `inher`
|
|
- 0.7 (AI)
|
|
1. **Operator definition** - Clarified that operators can be user/library defined via trait implementation
|
|
2. **Generic function syntax** - Fixed to use trait constraints in type tuple, not generic parameters
|
|
3. **Variable arguments with Iterable** - Changed array syntax to Iterable trait for variable args
|
|
4. **Example classifications** - Cleaned up "Actual Language Definitions" vs examples distinction
|
|
5. **Struct field access** - Clarified that get and set consume their arguments
|
|
6. **Section 6 rename** - Renamed "Operators (Postfix)" to "Built-in Operators"
|
|
7. **Module syntax** - Added `::` prefix for module imports
|
|
8. **Module alias options** - Added multiple alias syntax options
|
|
- 0.7.1 (Human)
|
|
1. Formatting changes
|
|
- 0.7.2 (Human)
|
|
1. Removed AI editing restrictions of reviewed code blocks
|
|
- 0.8 (AI)
|
|
1. **Document reorganization** - Restructured for user-focused learning
|
|
2. **Section consolidation** - Moved implementation details to appendices
|
|
3. **Minimal duplication** - Added cross-references instead of repeating content
|
|
4. **Shorter sections** - Split large sections into focused subsections
|
|
5. **New appendices** - Added Standard Library and Operator references
|
|
6. **Tutorial content** - Added beginner tutorials to Appendix G
|
|
7. **Trait reference** - Consolidated all trait definitions in Appendix B
|
|
8. **Grammar simplification** - Referenced Implementable trait instead of repeating
|
|
- 0.8.1 (Human)
|
|
1. Added links
|
|
- 0.8.2 (AI)
|
|
1. **Constants** - Added constant definition syntax and semantics
|
|
2. **Enhanced literals** - Added underscore separators, character literals, octal syntax
|
|
3. **Mathematical functions** - Added sqrt, abs, trig functions, rounding, min/max
|
|
4. **Randomness** - Added rand and seed operators
|
|
5. **Array enhancements** - Added typed array syntax and arrays of structs
|
|
6. **Collection functions** - Added zip, enumerate, sum, mean, foldl, foldr
|
|
7. **String utilities** - Added replace, trim, find, starts_with, ends_with, format
|
|
8. **Testing support** - Added assert operator for inline testing
|
|
9. **Reflection operators** - Added type_of and implements for runtime introspection
|
|
10. **Compiler directives** - Added mention of implementation-specific directives
|
|
11. **Type reference** - Added Appendix H with complete type reference
|
|
12. **Math trait** - Added comprehensive Math trait to Appendix B
|
|
13. **Overflow behavior** - Documented integer wrap and float IEEE behavior
|
|
14. **Grammar updates** - Expanded Appendix D with new syntax forms
|
|
15. **Cross-references** - Updated all references to include new operators and functions
|
|
|
|
---
|
|
|
|
## 1. Overview
|
|
|
|
A statically-typed, stack-based language with pure postfix notation combining the execution model of HP's RPL, the type system of C and Rust, and modern array operations from Uiua.
|
|
|
|
### Design Principles
|
|
- Everything is postfix - no exceptions
|
|
- Stack-based execution (no local variables)
|
|
- Static typing with type inference
|
|
- Manual heap memory management (future feature)
|
|
- Types define what things are, traits define how things act
|
|
- All constructs are implicitly generic
|
|
- Every operator is defined by a trait
|
|
|
|
### Operators vs Functions
|
|
|
|
**Operators** are operations that implement trait methods. They can be:
|
|
- Built-in primitive operations provided by the language
|
|
- User-defined operations implementing custom trait methods
|
|
- Library-defined operations
|
|
- All operators must be backed by a trait
|
|
- Cannot share names with functions
|
|
- Are the fundamental building blocks of the language
|
|
- Examples: `+`, `-`, `dup`, `swap`, `if`, `while` (built-in); custom operators via trait implementation
|
|
|
|
**Functions** are user-defined or library-defined procedures. They:
|
|
- Do not implement traits directly (though they may use operators that do)
|
|
- Cannot share names with operators
|
|
- Are defined using the `fn` operator
|
|
- Examples: `factorial`, `fizzbuzz`, `square`
|
|
|
|
**Naming Rule**: Once a name is used for either an operator or a function, it cannot be reused for the other category.
|
|
|
|
### Document Organization
|
|
|
|
This specification is organized to support both learning and reference:
|
|
|
|
**Sections 1-7** cover the fundamentals needed to write basic programs:
|
|
- Lexical structure, primitive types, basic operations
|
|
- Functions and control flow
|
|
- Data structures
|
|
|
|
**Sections 8-10** cover intermediate concepts:
|
|
- Type system formalization
|
|
- Trait system for behavioral contracts
|
|
- Generic programming
|
|
|
|
**Section 11** covers advanced topics:
|
|
- Dynamic code evaluation
|
|
- Identifier literals
|
|
- Testing and assertions
|
|
- Reflection
|
|
- Standard library overview
|
|
|
|
**Appendices** provide complete references:
|
|
- A: Standard Library (alphabetical reference)
|
|
- B: Complete Trait Reference (all trait definitions)
|
|
- C: Complete Operator Reference (all operators)
|
|
- D: Grammar Summary
|
|
- E: Module System (future)
|
|
- F: Memory Management (future)
|
|
- G: Examples & Tutorials
|
|
- H: Complete Type Reference
|
|
|
|
### Reading Guide
|
|
|
|
**New users**: Start with Sections 1-7 to learn the language basics. Work through the tutorials in Appendix G as you go.
|
|
|
|
**Experienced programmers**: Skim Sections 1-4, focus on Sections 5-11 for language-specific features.
|
|
|
|
**Implementers**: Read all sections, paying special attention to Sections 8-10 and Appendices B-D for complete specifications.
|
|
|
|
**Reference lookup**: Use Appendices A-C and H for quick reference to standard library functions, traits, operators, and types.
|
|
|
|
---
|
|
|
|
## 2. Lexical Structure
|
|
|
|
### 2.1 Comments and Directives
|
|
|
|
**Single-line Comments**:
|
|
```
|
|
// Single-line comment
|
|
```
|
|
|
|
**Compiler Directives**:
|
|
|
|
The language reserves the `#` character for implementation-specific compiler directives. The `#` character cannot appear in identifiers.
|
|
|
|
```
|
|
#!/usr/bin/env stack_lang
|
|
```
|
|
|
|
Directives are implementation-specific and not part of the core language specification. Implementations may support various directives for version requirements, optimization hints, or other configuration.
|
|
|
|
### 2.2 Identifiers and Constants
|
|
|
|
**Regular Identifiers**
|
|
- Start with letter or underscore: `[a-zA-Z_][a-zA-Z0-9_]*`
|
|
- Case-sensitive
|
|
- When encountered, identifiers are executed immediately
|
|
- Cannot contain `#`, whitespace, `{}`, `[]`, `()`, `.`, `'`, `"`, or `::`
|
|
|
|
**Identifier Literals**
|
|
- Prefix with `::` to push the identifier itself onto the stack instead of executing it
|
|
- Syntax: `::name` pushes the identifier `name` as a value
|
|
- Example: `::Addable` pushes the identifier `Addable` onto the stack
|
|
- Example: `::Point` pushes the identifier `Point` onto the stack
|
|
|
|
**Constants**
|
|
|
|
Constants are compile-time values that are immutable and available throughout the scope where they are defined.
|
|
|
|
**Syntax**: `value ::name const`
|
|
|
|
**Examples**:
|
|
```
|
|
3.1415926535 ::pi const
|
|
9.81 ::gravity const
|
|
299792458 ::speed_of_light const
|
|
|
|
// Use constants like any other value
|
|
10 pi * 2 / // Calculate circumference / 2
|
|
```
|
|
|
|
**Properties**:
|
|
- Constants can be evaluated at compile time
|
|
- Constants are immutable - they cannot be reassigned
|
|
- Constants defined at module scope are accessible via `Module::CONST_NAME` (when modules are implemented)
|
|
- Constants can be any literal value or compile-time expression
|
|
|
|
> **Advanced Usage**: See [Section 11.2](./advanced_topics.html#112-identifier-literals) for complete identifier literal rules and context-dependent behavior.
|
|
|
|
### 2.3 Literals
|
|
|
|
**Integer Literals**
|
|
|
|
```
|
|
42 // i64 (default)
|
|
42:i32 // Annotate as i32
|
|
0xFF // hexadecimal
|
|
0b1010 // binary
|
|
0o755 // octal
|
|
1_000_000 // underscore separators (ignored)
|
|
```
|
|
|
|
**Overflow Behavior**: Integer arithmetic wraps on overflow. For example, adding 1 to 127, the maximum value of an `i8`, produces -128.
|
|
|
|
**Floating Point Literals**
|
|
```
|
|
3.14 // f64 (default)
|
|
3.14:f32 // Annotate as f32
|
|
1_000.5 // underscore separators allowed
|
|
```
|
|
|
|
**Overflow Behavior**: Floating point operations follow IEEE 754 semantics, producing infinity or NaN for overflow/undefined operations.
|
|
|
|
**Character Literals**
|
|
```
|
|
'A' // Single character
|
|
'\n' // Escape sequence
|
|
'\x41' // Hexadecimal (A)
|
|
'\u{1F600}' // Unicode (😀)
|
|
```
|
|
|
|
**String Literals**
|
|
```
|
|
"hello world"
|
|
"escape sequences: \n \t \\ \""
|
|
```
|
|
|
|
**Escape Sequences**
|
|
- `\n` - Newline (LF)
|
|
- `\r` - Carriage return (CR)
|
|
- `\t` - Tab
|
|
- `\\` - Backslash
|
|
- `\"` - Double quote
|
|
- `\'` - Single quote
|
|
- `\0` - Null character
|
|
- `\xNN` - Hexadecimal byte (e.g., `\x41` for 'A')
|
|
- `\u{NNNN}` - Unicode code point (e.g., `\u{1F600}` for 😀)
|
|
|
|
**Boolean Literals**
|
|
```
|
|
true
|
|
false
|
|
```
|
|
|
|
**Array Literals**
|
|
|
|
```
|
|
[1 2 3 4 5] // array of i64
|
|
[1.0 2.0 3.0] // array of f64
|
|
[[1 2] [3 4]] // 2D array
|
|
|
|
// Typed arrays
|
|
[1 2 3 :i16] // array of i16
|
|
[[1.0 2.0] [3.0 4.0] :f32] // 2D array of f32
|
|
|
|
// Arrays of structs (when Point is defined)
|
|
[{1 2} {3 4} :Point] // array of Point structs
|
|
```
|
|
|
|
---
|
|
|
|
## 3. Primitive Types
|
|
|
|
The language provides several built-in primitive types for common values:
|
|
|
|
**Integer Types**
|
|
- `i8`, `i16`, `i32`, `i64` - Signed integers (8, 16, 32, 64 bits)
|
|
- `u8`, `u16`, `u32`, `u64` - Unsigned integers (8, 16, 32, 64 bits)
|
|
- Default integer literal type: `i64`
|
|
|
|
**Floating Point Types**
|
|
- `f32` - Single-precision floating point (32 bits)
|
|
- `f64` - Double-precision floating point (64 bits)
|
|
- Default floating point literal type: `f64`
|
|
|
|
**Other Types**
|
|
- `bool` - Boolean values (`true` or `false`)
|
|
- `char` - Single UTF-8 character
|
|
|
|
**Type Annotations**
|
|
|
|
You can explicitly annotate literal types:
|
|
```
|
|
42:i32 // 32-bit integer
|
|
3.14:f32 // 32-bit float
|
|
'A' // character
|
|
```
|
|
|
|
**Pointer Types**
|
|
|
|
Raw pointers (`ptr`) are a future feature. See [Appendix F](./memory_management.html) for the planned pointer type system.
|
|
|
|
> **Related**: See Section 8 for the complete type system, including composite types and type inference. See [Appendix H](./complete_type_reference.html) for detailed information about all types.
|
|
|
|
---
|
|
|
|
## 4. Basic Operations
|
|
|
|
### 4.1 Stack Operations
|
|
|
|
Stack manipulation is fundamental to the language. All values exist on the stack, and these operations let you rearrange them.
|
|
|
|
**Basic Manipulation**
|
|
```
|
|
dup // ( a -- a a ) Duplicate top item
|
|
drop // ( a -- ) Remove top item
|
|
swap // ( a b -- b a ) Swap top two items
|
|
over // ( a b -- a b a ) Copy second item to top
|
|
rot // ( a b c -- b c a) Rotate top three items
|
|
```
|
|
|
|
**Stack Inspection**
|
|
```
|
|
depth // ( -- n ) Push current stack depth
|
|
pick // ( n -- x ) Copy nth item to top (0 = top)
|
|
roll // ( n times -- ) Rotate n items, times times
|
|
```
|
|
|
|
**Stack Effect Notation**: Throughout this specification, comments use stack effect notation to show what operations consume and produce. The format is `// ( before -- after )` where items on the left of `--` are consumed from the stack, and items on the right are produced.
|
|
|
|
**Examples**:
|
|
```
|
|
5 dup // => 5 5
|
|
5 10 swap // => 10 5
|
|
1 2 3 rot // => 2 3 1
|
|
1 2 3 depth // => 1 2 3 3
|
|
```
|
|
|
|
> **Implementation Details**: Stack operations implement the `::Stackable` trait. See [Appendix B](./complete_trait_reference.html) for the complete trait definition.
|
|
|
|
### 4.2 Arithmetic Operators
|
|
|
|
Basic arithmetic operations work on numeric types:
|
|
|
|
```
|
|
3 4 + // ( a b -- result ) Addition
|
|
10 3 - // ( a b -- result ) Subtraction
|
|
5 6 * // ( a b -- result ) Multiplication
|
|
20 4 / // ( a b -- result ) Division
|
|
17 5 % // ( a b -- result ) Modulo (remainder)
|
|
2 8 ^ // ( a b -- result ) Exponentiation
|
|
100 log // ( a -- result ) Logarithm base 10
|
|
2.718 ln // ( a -- result ) Natural logarithm
|
|
```
|
|
|
|
**Mathematical Functions**:
|
|
```
|
|
16 sqrt // ( a -- result ) Square root
|
|
-5 abs // ( a -- result ) Absolute value
|
|
0.0 sin // ( a -- result ) Sine (radians)
|
|
0.0 cos // ( a -- result ) Cosine (radians)
|
|
0.0 tan // ( a -- result ) Tangent (radians)
|
|
1.0 asin // ( a -- result ) Arc sine
|
|
1.0 acos // ( a -- result ) Arc cosine
|
|
1.0 atan // ( a -- result ) Arc tangent
|
|
1.0 0.0 atan2 // ( y x -- result ) Two-argument arc tangent
|
|
3.14 floor // ( a -- result ) Round down
|
|
3.14 ceil // ( a -- result ) Round up
|
|
3.14 round // ( a -- result ) Round to nearest
|
|
3 5 min // ( a b -- result ) Minimum of two values
|
|
3 5 max // ( a b -- result ) Maximum of two values
|
|
```
|
|
|
|
**Examples**:
|
|
```
|
|
10 5 + // => 15
|
|
10 3 / // => 3
|
|
10 3 % // => 1
|
|
2 10 ^ // => 1024
|
|
16 sqrt // => 4.0
|
|
-42 abs // => 42
|
|
3.14159 sin // => ~0.0
|
|
3.7 round // => 4.0
|
|
```
|
|
|
|
> **Implementation Details**: Arithmetic operators implement the `::Addable`, `::Multiplyable`, `::Exponentiable`, `::Logarithmic`, and `::Math` traits. See [Appendix B](./complete_trait_reference.html) for complete trait definitions and [Appendix C](./complete_operator_reference.html) for the full operator reference.
|
|
|
|
### 4.3 Comparison Operators
|
|
|
|
Comparison operations return boolean values:
|
|
|
|
```
|
|
5 3 > // ( a b -- bool ) Greater than
|
|
5 3 >= // ( a b -- bool ) Greater or equal
|
|
5 3 < // ( a b -- bool ) Less than
|
|
5 3 <= // ( a b -- bool ) Less or equal
|
|
5 5 == // ( a b -- bool ) Equal
|
|
5 3 != // ( a b -- bool ) Not equal
|
|
```
|
|
|
|
**Examples**:
|
|
```
|
|
10 5 > // => true
|
|
10 10 == // => true
|
|
10 5 < // => false
|
|
```
|
|
|
|
> **Implementation Details**: Comparison operators implement the `::Orderable` and `::Equatable` traits. See [Appendix B](./complete_trait_reference.html) for complete trait definitions.
|
|
|
|
### 4.4 Logical Operators
|
|
|
|
Logical operations work with boolean values and truthiness:
|
|
|
|
```
|
|
true false and // ( a b -- result ) Logical AND
|
|
true false or // ( a b -- result ) Logical OR
|
|
true not // ( a -- result ) Logical NOT
|
|
```
|
|
|
|
**Truthiness**: Non-boolean values can be tested for truthiness. By default, most values are truthy. Numbers are falsy when zero, `Option::None` is falsy, `Result::Err` is falsy.
|
|
|
|
**Examples**:
|
|
```
|
|
true true and // => true
|
|
true false or // => true
|
|
false not // => true
|
|
5 0 and // => 0 (falsy)
|
|
```
|
|
|
|
> **Implementation Details**: Logical operators implement the `::Logical` trait. See [Appendix B](./complete_trait_reference.html) for the complete trait definition and truthiness rules.
|
|
|
|
### 4.5 Bitwise Operators
|
|
|
|
Bitwise operations work on integer types:
|
|
|
|
```
|
|
0xFF 0x0F bitand // ( a b -- result ) Bitwise AND
|
|
0xFF 0x0F bitor // ( a b -- result ) Bitwise OR
|
|
0xFF 0x0F bitxor // ( a b -- result ) Bitwise XOR
|
|
0xFF bitnot // ( a -- result ) Bitwise NOT
|
|
8 2 shl // ( a n -- result ) Left shift
|
|
8 2 shr // ( a n -- result ) Right shift
|
|
```
|
|
|
|
**Examples**:
|
|
```
|
|
0xFF 0x0F bitand // => 0x0F
|
|
0xF0 0x0F bitor // => 0xFF
|
|
0xFF bitnot // => 0xFFFFFFFFFFFFFF00 (on 64-bit)
|
|
4 2 shl // => 16
|
|
```
|
|
|
|
> **Implementation Details**: Bitwise operators implement the `::Bitwise` trait. See [Appendix B](./complete_trait_reference.html) for the complete trait definition.
|
|
|
|
### 4.6 Randomness
|
|
|
|
Random number generation is provided through built-in operators:
|
|
|
|
```
|
|
rand // ( -- f64 ) Generate random f64 in range [0.0, 1.0)
|
|
seed // ( u64 -- ) Seed the random number generator
|
|
```
|
|
|
|
**Examples**:
|
|
```
|
|
rand // => 0.7234... (random value)
|
|
12345 seed // Seed RNG with specific value
|
|
rand // => 0.4321... (deterministic after seed)
|
|
|
|
// Random integer in range
|
|
100 rand * floor // Random integer 0-99
|
|
```
|
|
|
|
> **Implementation Note**: The specific random number generation algorithm is implementation-defined but should be a high-quality PRNG suitable for general use (not cryptography).
|
|
|
|
---
|
|
|
|
## 5. Functions
|
|
|
|
Functions are user-defined procedures that encapsulate reusable code. They are the primary abstraction mechanism in the language.
|
|
|
|
### 5.1 What are Functions
|
|
|
|
Functions differ from operators:
|
|
- **Operators** implement trait methods and are the fundamental building blocks
|
|
- **Functions** are user-defined procedures that use operators
|
|
- Operators and functions cannot share names
|
|
|
|
> **Related**: See [Section 1 "Operators vs Functions"](./overview.html#operators-vs-functions) for a complete explanation of the distinction.
|
|
|
|
### 5.2 Defining Functions
|
|
|
|
**Syntax**: `(inputs -- outputs) { body } ::name fn`
|
|
|
|
The function signature specifies stack effects (what is consumed and produced), the body contains the implementation, and the name identifies the function.
|
|
|
|
**Examples**:
|
|
```
|
|
// Simple function - requires Multiplyable trait
|
|
(Multiplyable -- Multiplyable) { dup * } ::square fn
|
|
|
|
// Use it
|
|
5 square // => 25
|
|
|
|
// Multiple inputs and outputs
|
|
(Number Number -- Number Number) {
|
|
over over / swap %
|
|
} ::divmod fn
|
|
|
|
10 3 divmod // => 3 1 (quotient remainder)
|
|
```
|
|
|
|
**Function Bodies**: The `{ }` braces contain a TokenString that is parsed as the function body when the function is defined. See [Section 5.5](./functions.html#55-token-strings) for details on TokenStrings.
|
|
|
|
> **Related**: See [Section 10.2](./generic_programming.html#102-generic-functions) for generic functions with type parameters.
|
|
|
|
### 5.3 Calling Functions
|
|
|
|
Functions are called by simply writing their name. The postfix notation means arguments must be on the stack before the function name:
|
|
|
|
```
|
|
// Define a function
|
|
(Number Number -- Number) { + } ::add fn
|
|
|
|
// Call it
|
|
3 4 add // => 7
|
|
|
|
// Chain functions
|
|
5 square 2 * // => 50 (square 5, then multiply by 2)
|
|
```
|
|
|
|
**Function Chaining**: Since everything is postfix, functions naturally chain left-to-right:
|
|
```
|
|
10 square 2 / 5 + // ((10²) / 2) + 5 = 55
|
|
```
|
|
|
|
### 5.4 Recursion
|
|
|
|
Functions can call themselves recursively:
|
|
|
|
```
|
|
(Number -- Number) {
|
|
dup 1 <=
|
|
{ drop 1 }
|
|
{ dup 1 - factorial * }
|
|
if
|
|
} ::factorial fn
|
|
|
|
5 factorial // => 120
|
|
```
|
|
|
|
**Stack Considerations**: Recursive functions consume stack space. Deep recursion may cause stack overflow. Consider iterative alternatives for performance-critical code.
|
|
|
|
### 5.5 Token Strings
|
|
|
|
Token strings are lexed but unparsed code blocks enclosed in `{ }`. They are parsed differently depending on which operator uses them.
|
|
|
|
**Operators that parse TokenStrings:**
|
|
- `fn` - Parses as function body (code block)
|
|
- `trait` - Parses as trait definition (method signatures)
|
|
- `impl` - Parses as trait implementation (method definitions)
|
|
- `eval` - Parses and executes as code block immediately
|
|
- `lambda` - Parses as code block, pushes the block as a callable value
|
|
- `if` - Parses both TokenStrings as code blocks (then/else branches)
|
|
- `while` - Parses both TokenStrings as code blocks (condition/body)
|
|
- `for` - Parses TokenString as code block (loop body)
|
|
- `match` - Parses TokenString as pattern matching arms
|
|
- `map`, `filter`, `reduce`, `each` - Parse TokenStrings as code blocks for array operations
|
|
|
|
**Examples**:
|
|
```
|
|
// Function body (parsed by fn)
|
|
(Number -- Number) { dup * } ::square fn
|
|
|
|
// Conditional branches (parsed by if)
|
|
x 0 > { "positive" print } { "negative" print } if
|
|
|
|
// Loop body (parsed by while)
|
|
{ dup 10 < } { dup print 1 + } while
|
|
```
|
|
|
|
### 5.6 Lambda Functions
|
|
|
|
The `lambda` operator converts a TokenString into a callable code block that can be stored and passed around:
|
|
|
|
```
|
|
{ dup * } lambda // Creates a callable code block
|
|
::square_fn swap // Store reference to the lambda
|
|
|
|
// Later use:
|
|
5 square_fn eval // Calls the lambda: pushes 25
|
|
```
|
|
|
|
**Use Cases**:
|
|
- Creating first-class functions
|
|
- Passing code blocks as values
|
|
- Dynamic dispatch
|
|
- Higher-order operations
|
|
|
|
**Example with arrays**:
|
|
```
|
|
// Store a lambda and use it with map
|
|
{ 2 * } lambda ::double swap
|
|
[1 2 3 4] double map // => [2 4 6 8]
|
|
```
|
|
|
|
> **Related**: See [Section 11.1](advanced_topics.html#111-dynamic-code-evaluation) for the `eval` operator used to execute lambdas.
|
|
|
|
---
|
|
|
|
## 6. Control Flow
|
|
|
|
### 6.1 Conditionals
|
|
|
|
**Syntax**: `condition { then-block } { else-block } if`
|
|
|
|
The condition is evaluated first, then both code blocks are provided, followed by the `if` operator which chooses which block to execute.
|
|
|
|
**Examples**:
|
|
```
|
|
// if-then (else block is empty)
|
|
x 0 > { "positive" print } { } if
|
|
|
|
// if-then-else
|
|
x 0 >
|
|
{ "positive" print }
|
|
{ "non-positive" print }
|
|
if
|
|
|
|
// Returning values
|
|
a b >
|
|
{ a }
|
|
{ b }
|
|
if // Pushes the maximum of a and b
|
|
|
|
// Nested conditionals
|
|
x 0 >
|
|
{
|
|
y 0 >
|
|
{ "both positive" print }
|
|
{ "x positive, y not" print }
|
|
if
|
|
}
|
|
{ "x not positive" print }
|
|
if
|
|
```
|
|
|
|
**Important**: The `if` operator parses both TokenStrings as code blocks. The condition must produce a boolean value (or truthy value) before the `if` operator.
|
|
|
|
### 6.2 While Loops
|
|
|
|
**Syntax**: `{ condition-block } { body-block } while`
|
|
|
|
The while loop repeatedly evaluates the condition block and executes the body block as long as the condition is truthy.
|
|
|
|
**Examples**:
|
|
```
|
|
// Sum 1 to 10
|
|
0 1 // sum counter
|
|
{ dup 10 <= } // condition block
|
|
{ // body block
|
|
over over + // Add counter to sum
|
|
swap 1 + swap // Increment counter
|
|
}
|
|
while
|
|
drop // Drop counter, leave sum
|
|
|
|
// Infinite loop with break
|
|
{ true } {
|
|
// body
|
|
condition { break } { } if
|
|
} while
|
|
```
|
|
|
|
**Condition Evaluation**: The condition block is re-evaluated before each iteration. It should leave a boolean (or truthy) value on the stack.
|
|
|
|
### 6.3 For Loops
|
|
|
|
**Syntax**: `start end { body-with-counter } for`
|
|
|
|
The for loop iterates from `start` to `end` (inclusive), pushing the loop counter onto the stack for each iteration before executing the body.
|
|
|
|
**Examples**:
|
|
```
|
|
// Print 1 to 10
|
|
1 10 {
|
|
// Stack has loop counter on top
|
|
dup print
|
|
} for
|
|
|
|
// FizzBuzz
|
|
1 100 {
|
|
dup fizzbuzz
|
|
} for
|
|
|
|
// Accumulation
|
|
0 // accumulator
|
|
1 10 {
|
|
+ // add counter to accumulator
|
|
} for
|
|
// Result: 55 (sum of 1 to 10)
|
|
```
|
|
|
|
**Loop Counter**: The loop counter is automatically pushed onto the stack before each iteration. Your body block should consume it or clean it up.
|
|
|
|
### 6.4 Loop Control
|
|
|
|
```
|
|
break // Exit the current loop immediately
|
|
continue // Skip to the next iteration of the current loop
|
|
```
|
|
|
|
**Examples**:
|
|
```
|
|
// Break example
|
|
1 100 {
|
|
dup 50 ==
|
|
{ break }
|
|
{ dup print }
|
|
if
|
|
} for // Prints 1-49, stops at 50
|
|
|
|
// Continue example
|
|
1 10 {
|
|
dup 2 % 0 ==
|
|
{ continue }
|
|
{ dup print }
|
|
if
|
|
} for // Prints only odd numbers: 1 3 5 7 9
|
|
```
|
|
|
|
### 6.5 Pattern Matching
|
|
|
|
**Syntax**: `value { pattern => block ... } match`
|
|
|
|
Pattern matching allows you to test a value against multiple patterns and execute the corresponding block.
|
|
|
|
**Examples**:
|
|
```
|
|
// Option matching
|
|
opt_value {
|
|
Some(x) => { x print }
|
|
None => { "Nothing" print }
|
|
} match
|
|
|
|
// Multiple patterns
|
|
status {
|
|
Pending => { "Waiting" print }
|
|
Active => { "Running" print }
|
|
Complete => { "Done" print }
|
|
} match
|
|
|
|
// Result matching
|
|
result {
|
|
Ok(val) => { val process }
|
|
Err(e) => { e "Error: " swap concat print }
|
|
} match
|
|
```
|
|
|
|
**Pattern Syntax**: Patterns can match enum variants, union variants, or literal values. The matched value (if any) is bound and available in the corresponding block.
|
|
|
|
---
|
|
|
|
## 7. Data Structures
|
|
|
|
### 7.1 Structs
|
|
|
|
Structs define composite types with named fields.
|
|
|
|
**Definition Syntax**: `(field_types -- ) { field_names: } ::name<type_params>? struct`
|
|
|
|
**Examples**:
|
|
|
|
```
|
|
// Define Point struct - generic over coordinate types
|
|
(T T --) { x: y: } ::Point<T> struct
|
|
|
|
// Use with specific types
|
|
3.0 4.0 Point // Creates Point with f64 fields
|
|
3 4 Point // Creates Point with i64 fields
|
|
|
|
// More complex struct
|
|
(T U V --) {
|
|
width:
|
|
height:
|
|
depth:
|
|
} ::Box3D<T U V> struct
|
|
|
|
10.0 20.0 30.0 Box3D
|
|
```
|
|
|
|
**Field Access**:
|
|
- **get**: `struct ::field get` - Consumes struct and field identifier, returns field value
|
|
- **set**: `value ::field set` - Consumes value and field identifier, returns modified struct
|
|
|
|
**Examples**:
|
|
```
|
|
point ::x get // Get x field (consumes point and ::x)
|
|
15.0 ::x set // Set x field to 15.0 (consumes value and ::x)
|
|
|
|
// Chaining with duplication
|
|
point dup ::x get 2 * over ::y get + // (point.x * 2) + point.y
|
|
```
|
|
|
|
> **Note**: Structs can be generic. See [Section 10.3](./generic_programming.html#103-generic-data-structures) for details on generic data structures.
|
|
|
|
### 7.2 Unions
|
|
|
|
Unions define tagged variants, where a value is one of several possible types.
|
|
|
|
**Definition Syntax**: `(variant_types -- ) { variants } ::name<type_params>? union`
|
|
|
|
**Examples**:
|
|
```
|
|
// Option type - generic over T
|
|
(T --) {
|
|
Some(T)
|
|
None
|
|
} ::Option<T> union
|
|
|
|
// Result type - generic over T and E
|
|
(T E --) {
|
|
Ok(T)
|
|
Err(E)
|
|
} ::Result<T E> union
|
|
|
|
// Create union values
|
|
42 Option::Some // Creates Option::Some(42)
|
|
Option::None // Creates Option::None
|
|
"success" Result::Ok // Creates Result::Ok("success")
|
|
"error" Result::Err // Creates Result::Err("error")
|
|
```
|
|
|
|
**Pattern Matching**: Unions are typically used with pattern matching ([Section 6.5](./control_flow.html#65-pattern-matching)) to handle different variants.
|
|
|
|
> **Note**: Unions can be generic. See [Section 10.3](./generic_programming.html#103-generic-data-structures) for details on generic data structures.
|
|
|
|
### 7.3 Enums
|
|
|
|
Enums define a fixed set of named values with optional integer assignments.
|
|
|
|
**Definition Syntax**: `{ variants } ::name enum`
|
|
|
|
**Examples**:
|
|
```
|
|
{
|
|
Pending 1: // Explicitly set to 1
|
|
Active: // Defaults to 2 (one plus the last)
|
|
Complete 0: // Explicitly set to 0
|
|
} ::Status enum
|
|
|
|
// Usage
|
|
Status::Pending // Creates Status::Pending (value 1)
|
|
Status::Active // Creates Status::Active (value 2)
|
|
Status::Complete // Creates Status::Complete (value 0)
|
|
```
|
|
|
|
**Automatic Values**: If not specified, enum values start at 0 and increment by 1 for each subsequent variant.
|
|
|
|
### 7.4 Arrays
|
|
|
|
Arrays are homogeneous collections of values.
|
|
|
|
**Array Literals**:
|
|
```
|
|
[1 2 3 4 5] // array of i64
|
|
[1.0 2.0 3.0] // array of f64
|
|
[[1 2] [3 4]] // 2D array
|
|
|
|
// Typed arrays
|
|
[1 2 3 :i16] // array of i16
|
|
[[1.0 2.0] [3.0 4.0] :f32] // 2D array of f32
|
|
|
|
// Arrays of structs (when Point is defined)
|
|
[{1 2} {3 4} :Point] // array of Point structs
|
|
```
|
|
|
|
**Basic Operations**:
|
|
```
|
|
arr 2 at // ( array index -- element ) Access element at index
|
|
arr 1 3 slice // ( array start end -- subarray ) Extract slice
|
|
arr length // ( array -- length ) Get array length
|
|
```
|
|
|
|
**Array Combinators**:
|
|
|
|
These operations take TokenString arguments containing function bodies:
|
|
|
|
```
|
|
// Map - transform each element
|
|
[1 2 3 4] { 2 * } map // => [2 4 6 8]
|
|
|
|
// Filter - keep elements matching predicate
|
|
[1 2 3 4 5] { 2 % 0 == } filter // => [2 4]
|
|
|
|
// Reduce - fold with accumulator
|
|
[1 2 3 4] 0 { + } reduce // => 10
|
|
|
|
// Each - apply to each element (side effects)
|
|
[[1 2] [3 4]] { sum print } each
|
|
|
|
// Foldl - left fold with accumulator
|
|
[1 2 3 4] 0 { + } foldl // => 10 (same as reduce)
|
|
|
|
// Foldr - right fold with accumulator
|
|
[1 2 3 4] 0 { + } foldr // => 10 (for commutative ops)
|
|
```
|
|
|
|
**Array Utilities**:
|
|
```
|
|
// Zip - combine two arrays element-wise
|
|
[1 2 3] [4 5 6] zip // => [[1 4] [2 5] [3 6]]
|
|
|
|
// Enumerate - add indices to elements
|
|
["a" "b" "c"] enumerate // => [[0 "a"] [1 "b"] [2 "c"]]
|
|
|
|
// Sum - sum all numeric elements
|
|
[1 2 3 4 5] sum // => 15
|
|
|
|
// Mean - calculate average
|
|
[1 2 3 4 5] mean // => 3.0
|
|
```
|
|
|
|
**Array Arithmetic**:
|
|
```
|
|
[1 2 3] [4 5 6] +. // Element-wise add: [5 7 9]
|
|
[1 2 3] [4 5 6] *. // Element-wise multiply: [4 10 18]
|
|
[1 2 3] 2 *. // Scalar multiply: [2 4 6]
|
|
```
|
|
|
|
**Array Manipulation**:
|
|
```
|
|
[1 2 3] [4 5 6] concat // Concatenate: [1 2 3 4 5 6]
|
|
[1 2 3] reverse // Reverse: [3 2 1]
|
|
[[1 2] [3 4]] transpose // Transpose: [[1 3] [2 4]]
|
|
[1 2 3 4] 2 window // Sliding window: [[1 2] [2 3] [3 4]]
|
|
```
|
|
|
|
> **Implementation Details**: Array operations implement various traits including `::ArrayOf<T>`, `::Selectable<T>`, `::Sliceable`, and `::Sized`. See [Appendix B](./complete_trait_reference.html) for complete trait definitions and [Appendix A](./standard_library.html) for the full array operation reference.
|
|
|
|
---
|
|
|
|
## 8. Type System
|
|
|
|
### 8.1 Types vs Traits
|
|
|
|
The language distinguishes between types (what things are) and traits (how things behave):
|
|
|
|
**Types** define the concrete structure and memory layout:
|
|
- `Point` - A struct type with two fields
|
|
- `Rectangle` - A struct type with width and height
|
|
- `i32` - A primitive integer type
|
|
- `Option<T>` - A union type that may contain a value
|
|
|
|
**Traits** define behavioral contracts:
|
|
- `::Addable` - Types that support addition and subtraction
|
|
- `::Drawable` - Types that can be drawn
|
|
- `::Stackable` - Types that support stack operations
|
|
|
|
**Key Distinction:**
|
|
- A value has a type (what it is structurally)
|
|
- A value implements a trait (how it behaves)
|
|
- Types are concrete; traits are interfaces
|
|
- Functions can be generic over traits
|
|
- Functions can specify types or traits in signatures
|
|
- Every operator must be backed by a trait
|
|
|
|
**Examples**:
|
|
```
|
|
// Point is a type
|
|
(T T --) { x: y: } ::Point<T> struct
|
|
|
|
// Addable is a trait
|
|
{
|
|
(Self Self -- Self) +:
|
|
(Self Self -- Self) -:
|
|
} ::Addable trait
|
|
|
|
// Point implements Addable (Point now behaves additively)
|
|
::Addable {
|
|
(Self Self -- Self) {
|
|
over ::x get over ::x get +
|
|
swap ::y get swap ::y get +
|
|
Point
|
|
} +:
|
|
// ... subtract implementation ...
|
|
} ::Point impl
|
|
```
|
|
|
|
> **Related**: See [Section 9](trait_system.html) for the complete trait system and [Appendix B](./complete_trait_reference.html) for all standard trait definitions. See [Appendix H](./complete_type_reference.html) for detailed information about all types.
|
|
|
|
### 8.2 Type Inference
|
|
|
|
The compiler infers types in most situations, minimizing the need for explicit type annotations.
|
|
|
|
**When Type Inference Works**:
|
|
```
|
|
42 // Inferred as i64 (default integer)
|
|
3.14 // Inferred as f64 (default float)
|
|
[1 2 3] // Inferred as array of i64
|
|
|
|
// Function return type inferred from body
|
|
(Number -- Number) { dup * } ::square fn
|
|
5 square // Compiler knows result is Number
|
|
```
|
|
|
|
**When Annotations Are Needed**:
|
|
```
|
|
42:i32 // Explicit annotation for 32-bit integer
|
|
3.14:f32 // Explicit annotation for 32-bit float
|
|
|
|
// Ambiguous generic contexts may need hints
|
|
parse // May need type context to know what to parse to
|
|
```
|
|
|
|
**Type Inference with Generics**:
|
|
```
|
|
// Type parameter T is inferred from usage
|
|
(T -- T) { } ::identity fn
|
|
|
|
5 identity // T inferred as i64
|
|
"hello" identity // T inferred as String
|
|
```
|
|
|
|
> **Related**: See [Section 10](./generic_programming.html) for generic programming and type parameter inference.
|
|
|
|
### 8.3 Type Tuples
|
|
|
|
Type tuples represent stack effects and are used in function signatures to specify what a function consumes from and produces to the stack.
|
|
|
|
**Syntax**: `(inputs -- outputs)`
|
|
|
|
**Examples**:
|
|
```
|
|
(T T -- T) // Two inputs of type T, one output of type T
|
|
(i32 f64 -- String) // Takes i32 and f64, returns String
|
|
(-- bool) // No inputs, returns bool
|
|
(Point --) // Takes Point, no outputs
|
|
(---) // No inputs, no outputs (side effects only)
|
|
```
|
|
|
|
**Variable Arguments with Iterable**:
|
|
|
|
For operations that need variable numbers of arguments, use the `Iterable` trait:
|
|
|
|
```
|
|
(-- Size) depth: // Zero arguments, returns stack depth
|
|
(String Iterable<Stringifiable> --) format: // String plus iterable of printable values
|
|
(Iterable<T> -- T) sum: // Iterable of values, returns sum
|
|
```
|
|
|
|
**Examples**:
|
|
```
|
|
"x=%d, y=%d" [x y] format // Format string with array of values
|
|
[1 2 3 4 5] sum // Sum array of numbers
|
|
depth print // No arguments needed
|
|
```
|
|
|
|
This approach keeps the type system simple without special variadic syntax.
|
|
|
|
### 8.4 Type Composition
|
|
|
|
Types can contain other types, creating composite data structures:
|
|
|
|
**Nested Structures**:
|
|
```
|
|
// Point contains two T values
|
|
(T T --) { x: y: } ::Point<T> struct
|
|
|
|
// Line contains two Points
|
|
(Point<T> Point<T> --) { start: end: } ::Line<T> struct
|
|
```
|
|
|
|
**Arrays of Types**:
|
|
```
|
|
[1 2 3] // Array of i64
|
|
[[1 2] [3 4]] // Array of arrays
|
|
[Point Point Point] // Array of Points
|
|
```
|
|
|
|
**Generic Composition**:
|
|
```
|
|
// Box contains a value of any type
|
|
(T --) { value: } ::Box<T> struct
|
|
|
|
// Option can contain any type (or nothing)
|
|
(T --) { Some(T) None } ::Option<T> union
|
|
|
|
// Nested generics
|
|
Option<Point<f64>> // Option containing a Point of f64s
|
|
```
|
|
|
|
---
|
|
|
|
## 9. Trait System
|
|
|
|
### 9.1 What are Traits
|
|
|
|
Traits define behavioral contracts - they specify what operations a type must support without dictating how those operations are implemented.
|
|
|
|
**Why Traits Exist**:
|
|
- Define common behavior across different types
|
|
- Enable generic programming with constraints
|
|
- Back every operator in the language
|
|
- Allow user-defined operators through trait implementation
|
|
|
|
**Standard Traits Overview**:
|
|
|
|
The language provides many built-in traits:
|
|
- `::Stackable` - Stack manipulation operations
|
|
- `::Addable`, `::Multiplyable` - Arithmetic operations
|
|
- `::Comparable`, `::Equatable` - Comparison operations
|
|
- `::Logical`, `::Bitwise` - Boolean and bit operations
|
|
- `::Sized`, `::Selectable<T>`, `::Sliceable` - Container operations
|
|
- `::Math` - Mathematical functions
|
|
- `::Number` - Composite numeric operations
|
|
- And many more...
|
|
|
|
> **Complete Reference**: See [Appendix B](./complete_trait_reference.html) for all standard trait definitions with complete documentation.
|
|
|
|
### 9.2 Defining Traits
|
|
|
|
**Syntax**: `{ method_signatures } ::identifier<type_params>? trait`
|
|
|
|
Traits can have methods or be empty (marker traits). Empty traits are typically used with inheritance.
|
|
|
|
**Examples**:
|
|
```
|
|
// Trait with methods
|
|
{
|
|
(Self -- ) draw:
|
|
} ::Drawable trait
|
|
|
|
// Trait with multiple methods
|
|
{
|
|
(Self Self -- Self) add:
|
|
(Self Self -- Self) sub:
|
|
(Self -- Self) neg:
|
|
} ::Numeric trait
|
|
|
|
// Generic trait
|
|
{
|
|
(Self T -- Self) append:
|
|
(Self -- T) pop:
|
|
} ::Container<T> trait
|
|
|
|
// Empty marker trait
|
|
{ } ::Serializable trait
|
|
```
|
|
|
|
**Method Signatures**: Within the TokenString, identifiers are method names and should not use the `::` prefix.
|
|
|
|
### 9.3 Implementing Traits
|
|
|
|
**Syntax**: `::trait_identifier { method_implementations } ::type_identifier impl`
|
|
|
|
**Implementation Rules**:
|
|
1. Implementing a trait for itself (`::Trait { ... } ::Trait impl`) creates a default implementation for all types
|
|
2. A trait must be defined before it can be implemented
|
|
3. Method implementations can be split across multiple `impl` blocks
|
|
4. Later implementations can override earlier ones for the same type
|
|
|
|
**Examples**:
|
|
|
|
```
|
|
// Implement Addable for i32
|
|
::Addable {
|
|
(Self Self -- Self) {
|
|
// Native addition implementation
|
|
} +:
|
|
|
|
(Self Self -- Self) {
|
|
// Native subtraction implementation
|
|
} -:
|
|
} ::i32 impl
|
|
|
|
// Implement Drawable for Rectangle
|
|
::Drawable {
|
|
(Self -- ) {
|
|
"Drawing rectangle" print
|
|
dup ::width get print
|
|
::height get print
|
|
} draw:
|
|
} ::Rectangle impl
|
|
```
|
|
|
|
> **More Examples**: See [Appendix G](./examples_and_tutorials.html) for complete implementation examples and tutorials.
|
|
|
|
### 9.4 Trait Inheritance
|
|
|
|
**Syntax**: `[ identifier_list ] ::identifier<type_params>? inher { methods } ::identifier<type_params>? trait`
|
|
|
|
Trait inheritance allows a trait to include all methods from parent traits, optionally adding new methods.
|
|
|
|
**Examples**:
|
|
```
|
|
// Combine multiple arithmetic traits
|
|
[ ::Addable ::Multiplyable ] ::BasicNumber inher
|
|
{ } ::BasicNumber trait
|
|
|
|
// Full Number inherits everything numeric
|
|
[ ::Addable ::Multiplyable ::Exponentiable ::Comparable ::Logarithmic ] ::Number inher
|
|
{ } ::Number trait
|
|
|
|
// Inheritance with additional methods
|
|
[ ::Drawable ::Transformable ::Collidable ] ::GameObject inher
|
|
{
|
|
(Self -- ) update:
|
|
(Self -- ) destroy:
|
|
} ::GameObject trait
|
|
```
|
|
|
|
**Generic Trait Inheritance**:
|
|
|
|
When inheriting from generic traits, you must either make the inheriting trait similarly generic or specify concrete types:
|
|
|
|
```
|
|
// Inheriting trait is also generic
|
|
[ ::Container<T> ] ::Stack<T> inher
|
|
{
|
|
(Self -- T) pop:
|
|
} ::Stack<T> trait
|
|
|
|
// Inheriting trait specifies concrete type
|
|
[ ::Container<i32> ] ::IntStack inher
|
|
{
|
|
(Self -- i32) pop:
|
|
} ::IntStack trait
|
|
```
|
|
|
|
### 9.5 Using Traits in Functions
|
|
|
|
Traits can be used as type constraints in function signatures:
|
|
|
|
**Examples**:
|
|
```
|
|
// Function requiring Drawable trait
|
|
(Drawable -- ) {
|
|
draw
|
|
} ::draw_object fn
|
|
|
|
// Function requiring Number trait
|
|
(Number Number -- Number) {
|
|
dup * swap dup * + // Pythagorean: a² + b²
|
|
} ::sum_of_squares fn
|
|
|
|
// Generic function with trait constraint
|
|
(Multiplyable -- Multiplyable) {
|
|
dup *
|
|
} ::square fn
|
|
```
|
|
|
|
**Multiple Constraints**: Use specific traits or composite traits that inherit from multiple parents:
|
|
```
|
|
// Requires both Addable and Comparable
|
|
(Number -- Number) { ... } ::some_function fn
|
|
|
|
// Number trait inherits from both, so this works
|
|
```
|
|
|
|
### 9.6 Standard Traits Overview
|
|
|
|
This section provides a brief overview of all standard traits. For complete definitions with all methods and documentation, see [Appendix B](./complete_trait_reference.html).
|
|
|
|
**Stack Operations**:
|
|
- `::Stackable` - Fundamental stack manipulation (dup, drop, swap, over, rot, pick, roll, depth)
|
|
|
|
**Arithmetic**:
|
|
- `::Addable` - Addition and subtraction (+, -)
|
|
- `::Multiplyable` - Multiplication, division, modulo (*, /, %)
|
|
- `::Exponentiable` - Exponentiation (^)
|
|
- `::Logarithmic` - Logarithm operations (log, ln, logb)
|
|
- `::Math` - Mathematical functions (sqrt, abs, sin, cos, tan, asin, acos, atan, atan2, floor, ceil, round, min, max)
|
|
- `::Number` - Composite trait combining all arithmetic and comparison
|
|
|
|
**Comparison**:
|
|
- `::Orderable` - Ordering comparisons (>, >=, <, <=)
|
|
- `::Equatable` - Equality comparisons (==, !=)
|
|
- `::Comparable` - Composite trait combining Orderable and Equatable
|
|
|
|
**Logical and Bitwise**:
|
|
- `::Logical` - Boolean operations (and, or, not, truthy)
|
|
- `::Bitwise` - Bit manipulation (bitand, bitor, bitxor, bitnot, shl, shr)
|
|
|
|
**Containers**:
|
|
- `::Sized` - Length information (length)
|
|
- `::Selectable<T>` - Element access (at)
|
|
- `::Sliceable` - Slicing operations (slice)
|
|
- `::Concatenable` - Concatenation (concat)
|
|
- `::ArrayOf<T>` - Composite array trait
|
|
- `::Iterable<T>` - Iteration support (next)
|
|
|
|
**Conversion**:
|
|
- `::Convertible` - Type conversions (to_i8, to_i16, ..., to_f32, to_f64)
|
|
- `::Stringifiable` - String conversion (to_str)
|
|
- `::Parseable` - Parse from string (parse)
|
|
|
|
**String Operations**:
|
|
- `::String` - String-specific operations (substr, split, replace, trim, find, starts_with, ends_with) - inherits from Concatenable
|
|
|
|
**Utilities**:
|
|
- `::Size` - Types suitable for indexing (inherits Addable, Comparable, Convertible)
|
|
- `::Identifier` - Marks identifiers
|
|
- `::Implementable` - Meta-trait for defining language constructs (trait, impl, inher)
|
|
|
|
> **Complete Reference**: See [Appendix B](./complete_trait_reference.html) for full trait definitions with all methods, examples, and implementation details.
|
|
|
|
---
|
|
|
|
## 10. Generic Programming
|
|
|
|
### 10.1 Type Parameters
|
|
|
|
Type parameters allow functions, structs, and traits to work with multiple types.
|
|
|
|
**Generic Syntax**: `<T>` where T is a type parameter
|
|
|
|
**Examples**:
|
|
```
|
|
// Generic struct
|
|
(T T --) { x: y: } ::Point<T> struct
|
|
|
|
// Generic union
|
|
(T --) { Some(T) None } ::Option<T> union
|
|
|
|
// Generic trait
|
|
{
|
|
(Self T -- Self) append:
|
|
} ::Container<T> trait
|
|
```
|
|
|
|
**Type Parameter Constraints**:
|
|
|
|
When operations are performed on type parameters, they must be constrained by traits:
|
|
|
|
```
|
|
// Unconstrained - no operations on T
|
|
(T -- T) { } ::identity fn
|
|
|
|
// Constrained - T must support multiplication
|
|
(T:Multiplyable -- T) { dup * } ::square fn
|
|
```
|
|
|
|
**Multiple Type Parameters**:
|
|
```
|
|
(T E --) { Ok(T) Err(E) } ::Result<T E> union
|
|
```
|
|
|
|
### 10.2 Generic Functions
|
|
|
|
Generic functions work with multiple types by using trait constraints in their type tuples.
|
|
|
|
**Syntax**: `(trait_constraints -- outputs) { body } ::name fn`
|
|
|
|
**Examples**:
|
|
```
|
|
// Generic identity - works with any type (no operations, no constraint needed)
|
|
(T -- T) { } ::identity fn
|
|
|
|
// Requires Addable trait
|
|
(Addable Addable -- Addable) {
|
|
+
|
|
} ::add_values fn
|
|
|
|
// Requires Number trait
|
|
(Number -- Number) {
|
|
dup 0 > { } { 0 swap - } if
|
|
} ::abs fn
|
|
|
|
// Multiple constraints
|
|
(Number Number -- Number) {
|
|
dup * swap dup * + // a² + b²
|
|
} ::pythagorean fn
|
|
```
|
|
|
|
**Type Inference**: The compiler infers the actual type from usage:
|
|
```
|
|
5 identity // T inferred as i64
|
|
"hello" identity // T inferred as String
|
|
3 4 add_values // Addable inferred as i64
|
|
```
|
|
|
|
### 10.3 Generic Data Structures
|
|
|
|
Structs and unions can be generic over type parameters:
|
|
|
|
**Generic Structs**:
|
|
```
|
|
// Point is generic over coordinate type
|
|
(T T --) { x: y: } ::Point<T> struct
|
|
|
|
// Use with different types
|
|
3.0 4.0 Point // Point<f64>
|
|
3 4 Point // Point<i64>
|
|
|
|
// Multiple type parameters
|
|
(T U --) { first: second: } ::Pair<T U> struct
|
|
5 "hello" Pair // Pair<i64 String>
|
|
```
|
|
|
|
**Generic Unions**:
|
|
```
|
|
// Option is generic over contained type
|
|
(T --) { Some(T) None } ::Option<T> union
|
|
|
|
42 Option::Some // Option<i64>::Some
|
|
"text" Option::Some // Option<String>::Some
|
|
Option::None // Option<T>::None (T inferred from context)
|
|
|
|
// Result with two type parameters
|
|
(T E --) { Ok(T) Err(E) } ::Result<T E> union
|
|
```
|
|
|
|
**Nested Generics**:
|
|
```
|
|
// Array of Options
|
|
[Option::Some Option::None] // Array of Option<T>
|
|
|
|
// Option of array
|
|
[1 2 3] Option::Some // Option<Array<i64>>
|
|
```
|
|
|
|
### 10.4 Generic Traits
|
|
|
|
Traits can be generic, allowing them to describe behavior parameterized over types.
|
|
|
|
**Generic Trait Syntax**:
|
|
```
|
|
// Container generic over element type
|
|
{
|
|
(Self T -- Self) append:
|
|
(Self -- T) pop:
|
|
} ::Container<T> trait
|
|
|
|
// Map generic over key and value types
|
|
{
|
|
(Self K -- V) get:
|
|
(Self K V -- Self) insert:
|
|
} ::Map<K V> trait
|
|
```
|
|
|
|
**Generic Trait Inheritance**:
|
|
|
|
When inheriting from generic traits, you must either:
|
|
1. Make the inheriting trait similarly generic
|
|
2. Specify concrete types for the generic parameters
|
|
|
|
```
|
|
// Inheriting trait is also generic
|
|
[ ::Container<T> ] ::Stack<T> inher
|
|
{
|
|
(Self -- T) peek:
|
|
} ::Stack<T> trait
|
|
|
|
// Inheriting trait specifies concrete type
|
|
[ ::Container<i32> ] ::IntStack inher
|
|
{
|
|
(Self -- i32) peek:
|
|
} ::IntStack trait
|
|
|
|
// Multiple generic inheritance
|
|
[ ::Selectable<T> ::Sized ::Sliceable ] ::ArrayOf<T> inher
|
|
{ } ::ArrayOf<T> trait
|
|
```
|
|
|
|
### 10.5 Type Parameter Enforcement
|
|
|
|
**Current Behavior**: Type parameters are currently suggestions when parsing code blocks. The compiler does not yet enforce that type parameters actually constrain how operators and functions act at parse time.
|
|
|
|
**Example**:
|
|
```
|
|
// Currently no error even without Multiplyable constraint
|
|
(T -- T) { dup * } ::square fn
|
|
|
|
// Should require constraint
|
|
(Multiplyable -- Multiplyable) { dup * } ::square fn
|
|
```
|
|
|
|
> **Future Enhancement**: See [Appendix F](./memory_management.html) for planned type parameter enforcement at parse time.
|
|
|
|
---
|
|
|
|
## 11. Advanced Topics
|
|
|
|
### 11.1 Dynamic Code Evaluation
|
|
|
|
The `eval` operator executes code dynamically at runtime by parsing and executing a TokenString.
|
|
|
|
**Syntax**: `{ code } eval`
|
|
|
|
**Examples**:
|
|
```
|
|
// Evaluate simple expression
|
|
"2 3 +" eval // Pushes 5
|
|
|
|
// Build and execute code
|
|
"(Multiplyable -- Multiplyable) { dup * } ::square fn" eval
|
|
5 square // 25
|
|
|
|
// Dynamic dispatch
|
|
operation_name " get" concat eval
|
|
```
|
|
|
|
**Use Cases**:
|
|
- Building code at runtime
|
|
- Dynamic dispatch based on runtime values
|
|
- Implementing interpreters or REPLs
|
|
- Meta-programming
|
|
|
|
**Warnings**:
|
|
- Eval introduces runtime overhead (parsing)
|
|
- Type safety is reduced (types checked at eval time, not compile time)
|
|
- Security risk if evaluating untrusted code
|
|
- Use sparingly and prefer static alternatives when possible
|
|
|
|
### 11.2 Identifier Literals
|
|
|
|
Identifier literals use the `::` prefix to push an identifier as a value rather than executing it.
|
|
|
|
**Syntax**: `::name`
|
|
|
|
**Context-Dependent Rules**:
|
|
|
|
**In function bodies and eval**: `::` is required for identifier literals
|
|
```
|
|
::Point // Pushes identifier "Point"
|
|
::Addable // Pushes identifier "Addable"
|
|
```
|
|
|
|
**In trait definitions**: `::` is not allowed (identifiers are method names)
|
|
```
|
|
{
|
|
(Self -- ) draw: // "draw:" is a method name, not a literal
|
|
} ::Drawable trait
|
|
```
|
|
|
|
**In trait implementations**: `::` is not allowed (identifiers are method names)
|
|
```
|
|
::Drawable {
|
|
(Self -- ) { ... } draw: // "draw:" is a method name
|
|
} ::Rectangle impl
|
|
```
|
|
|
|
**Use Cases**:
|
|
- Defining structs: `(T T --) { x: y: } ::Point<T> struct`
|
|
- Defining traits: `{ ... } ::Drawable trait`
|
|
- Field access: `point ::x get`
|
|
- Dynamic trait operations
|
|
- Meta-programming
|
|
|
|
### 11.3 Testing and Assertions
|
|
|
|
The `assert` operator provides inline testing and verification.
|
|
|
|
**Syntax**: `{ expression } { condition } assert`
|
|
|
|
The assert operator evaluates the expression block, then evaluates the condition block. If the condition returns false (or a falsy value), the program halts with an assertion failure.
|
|
|
|
**Examples**:
|
|
```
|
|
// Simple assertion
|
|
{ 2 3 + } { 5 == } assert
|
|
|
|
// Testing a function
|
|
{ 5 square } { 25 == } assert
|
|
|
|
// Multiple assertions
|
|
{ 10 3 divmod } { 3 == swap 1 == and } assert
|
|
|
|
// Assertion with message (implementation-specific)
|
|
{ 2 3 + } { 5 == } "Addition should work" assert
|
|
```
|
|
|
|
**Use Cases**:
|
|
- Unit testing
|
|
- Invariant checking
|
|
- Contract programming
|
|
- Debugging
|
|
|
|
**Testing Framework (Future)**: A more comprehensive testing framework with `test` and `test_error` operators is planned for future versions. See [Appendix F](./memory_management.html) for details.
|
|
|
|
### 11.4 Reflection
|
|
|
|
Reflection operators provide runtime type and trait information for debugging and metaprogramming.
|
|
|
|
**type_of Operator**
|
|
|
|
**Syntax**: `value type_of`
|
|
**Signature**: `(Self -- Identifier)`
|
|
|
|
Returns the type of a value as an identifier literal.
|
|
|
|
**Examples**:
|
|
```
|
|
42 type_of // Pushes ::i64
|
|
"hello" type_of // Pushes ::String
|
|
3.14 type_of // Pushes ::f64
|
|
|
|
// Use with conditionals
|
|
value type_of ::i64 ==
|
|
{ "It's an integer" print }
|
|
{ "It's not an integer" print }
|
|
if
|
|
```
|
|
|
|
**implements Operator**
|
|
|
|
**Syntax**: `value ::TraitName implements`
|
|
**Signature**: `(Self Identifier -- bool)`
|
|
|
|
Checks if a value's type implements a specific trait.
|
|
|
|
**Examples**:
|
|
```
|
|
42 ::Addable implements // => true
|
|
42 ::Drawable implements // => false
|
|
|
|
"hello" ::String implements // => true
|
|
[1 2 3] ::Iterable implements // => true
|
|
|
|
// Use with conditionals
|
|
value ::Serializable implements
|
|
{ value serialize }
|
|
{ "Cannot serialize" print }
|
|
if
|
|
```
|
|
|
|
**Use Cases**:
|
|
- Runtime type checking
|
|
- Debugging and introspection
|
|
- Dynamic dispatch based on traits
|
|
- Building generic utilities
|
|
- Error messages with type information
|
|
|
|
**Examples**:
|
|
```
|
|
// Generic print function with type info
|
|
(Self -- ) {
|
|
dup type_of to_str "Type: " swap concat print
|
|
dup ::Stringifiable implements
|
|
{ to_str print }
|
|
{ drop "Cannot print this type" print }
|
|
if
|
|
} ::debug_print fn
|
|
|
|
// Trait-based dispatch
|
|
(Self -- ) {
|
|
dup ::Drawable implements
|
|
{ draw }
|
|
{ drop "Not drawable" print }
|
|
if
|
|
} ::try_draw fn
|
|
```
|
|
|
|
### 11.5 Standard Library
|
|
|
|
The standard library provides I/O, string operations, type conversions, and utility functions. All standard library functions are automatically in scope (no imports needed in current version).
|
|
|
|
**I/O Operations**:
|
|
```
|
|
"Hello" print // Print string to stdout
|
|
"Enter name: " input // Read line from stdin
|
|
"file.txt" read // Read file contents as string
|
|
"data" "file.txt" write // Write string to file
|
|
```
|
|
|
|
**String Operations**:
|
|
```
|
|
"hello" " world" concat // Concatenate strings
|
|
"hello" length // Get string length
|
|
"hello" 1 3 substr // Extract substring
|
|
"a,b,c" "," split // Split by delimiter
|
|
["a" "b"] "," join // Join with delimiter
|
|
"hello world" "world" "Stack" replace // Replace substring
|
|
" hello " trim // Remove whitespace
|
|
"hello world" "world" find // Find substring position
|
|
"hello" "hel" starts_with // Check prefix
|
|
"hello" "llo" ends_with // Check suffix
|
|
"x=%d, y=%d" [5 10] format // Format string with values
|
|
```
|
|
|
|
**Type Conversion**:
|
|
```
|
|
42 to_f64 // Convert i32 to f64
|
|
3.14 to_i32 // Convert f64 to i32 (truncates)
|
|
"123" parse // Parse string to inferred type
|
|
42 to_str // Convert to string
|
|
```
|
|
|
|
**Array Operations**:
|
|
- Element access: `at`, `slice`
|
|
- Information: `length`, `shape`
|
|
- Combinators: `map`, `filter`, `reduce`, `each`, `foldl`, `foldr`
|
|
- Utilities: `zip`, `enumerate`, `sum`, `mean`
|
|
- Manipulation: `concat`, `reverse`, `transpose`, `window`
|
|
|
|
> **Complete Reference**: See [Appendix A](./standard_library.html) for the full standard library reference with all functions, signatures, and examples.
|
|
|
|
---
|
|
|
|
## Appendix A: Standard Library
|
|
|
|
This appendix provides a complete alphabetical reference of all standard library functions and operations.
|
|
|
|
### Standard Library Categories
|
|
|
|
**Array Operations**: [at](#at), [concat](#concat), [each](#each), [enumerate](#enumerate), [filter](#filter), [foldl](#foldl), [foldr](#foldr), [length](#length), [map](#map), [mean](#mean), [reduce](#reduce), [reverse](#reverse), [shape](#shape), [slice](#slice), [sum](#sum), [transpose](#transpose), [window](#window), [zip](#zip)
|
|
|
|
**I/O Operations**: [input](#input), [print](#print), [read](#read), [write](#write)
|
|
|
|
**String Operations**: [concat](#concat), [ends_with](#ends_with), [find](#find), [format](#format), [join](#join), [length](#length), [replace](#replace), [split](#split), [starts_with](#starts_with), [substr](#substr), [trim](#trim)
|
|
|
|
**Type Conversion**: [parse](#parse), [to_f32, to_f64](#to_f32-to_f64), [to_i8, to_i16, to_i32, to_i64](#to_i8-to_i16-to_i32-to_i64), [to_str](#to_str), [to_u8, to_u16, to_u32, to_u64](#to_u8-to_u16-to_u32-to_u64)
|
|
|
|
**Utility Operations**: [assert](#assert), [implements](#implements), [type_of](#type_of)
|
|
|
|
### Alphabetical Reference
|
|
|
|
#### abs
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Return the absolute value of a number.
|
|
**Example**:
|
|
```
|
|
-42 abs // Returns 42
|
|
3.14 abs // Returns 3.14
|
|
```
|
|
**See Also**: [min](#min), [max](#max)
|
|
|
|
#### acos
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate arc cosine (inverse cosine) in radians.
|
|
**Example**:
|
|
```
|
|
1.0 acos // Returns 0.0
|
|
0.0 acos // Returns ~1.5708 (pi/2)
|
|
```
|
|
**See Also**: [cos](#cos), [asin](#asin), [atan](#atan)
|
|
|
|
#### asin
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate arc sine (inverse sine) in radians.
|
|
**Example**:
|
|
```
|
|
1.0 asin // Returns ~1.5708 (pi/2)
|
|
0.0 asin // Returns 0.0
|
|
```
|
|
**See Also**: [sin](#sin), [acos](#acos), [atan](#atan)
|
|
|
|
#### assert
|
|
**Signature**: `(TokenString TokenString --)`
|
|
**Description**: Evaluate expression and condition, halt if condition is false.
|
|
**Example**:
|
|
```
|
|
{ 2 3 + } { 5 == } assert
|
|
{ 5 square } { 25 == } assert
|
|
```
|
|
**See Also**: [type_of](#type_of), [implements](#implements)
|
|
|
|
#### at
|
|
**Signature**: `(Selectable<T> Size -- T)`
|
|
**Trait**: Selectable<T>
|
|
**Description**: Access element at the given index.
|
|
**Example**:
|
|
```
|
|
[10 20 30] 1 at // Returns 20
|
|
```
|
|
**See Also**: [slice](#slice), [length](#length)
|
|
|
|
#### atan
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate arc tangent (inverse tangent) in radians.
|
|
**Example**:
|
|
```
|
|
1.0 atan // Returns ~0.7854 (pi/4)
|
|
0.0 atan // Returns 0.0
|
|
```
|
|
**See Also**: [tan](#tan), [atan2](#atan2), [asin](#asin)
|
|
|
|
#### atan2
|
|
**Signature**: `(Math Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate two-argument arc tangent of y/x in radians, using signs to determine quadrant.
|
|
**Example**:
|
|
```
|
|
1.0 1.0 atan2 // Returns ~0.7854 (pi/4)
|
|
1.0 0.0 atan2 // Returns ~1.5708 (pi/2)
|
|
```
|
|
**See Also**: [atan](#atan), [tan](#tan)
|
|
|
|
#### ceil
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Round number up to nearest integer.
|
|
**Example**:
|
|
```
|
|
3.14 ceil // Returns 4.0
|
|
-2.7 ceil // Returns -2.0
|
|
```
|
|
**See Also**: [floor](#floor), [round](#round)
|
|
|
|
#### concat
|
|
**Signature**: `(Concatenable Concatenable -- Concatenable)`
|
|
**Trait**: Concatenable
|
|
**Description**: Concatenate two containers or strings.
|
|
**Example**:
|
|
```
|
|
[1 2 3] [4 5 6] concat // Returns [1 2 3 4 5 6]
|
|
"hello" " world" concat // Returns "hello world"
|
|
```
|
|
**See Also**: [join](#join), [split](#split)
|
|
|
|
#### cos
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate cosine of angle in radians.
|
|
**Example**:
|
|
```
|
|
0.0 cos // Returns 1.0
|
|
3.14159 cos // Returns ~-1.0
|
|
```
|
|
**See Also**: [sin](#sin), [tan](#tan), [acos](#acos)
|
|
|
|
#### depth
|
|
**Signature**: `(-- Size)`
|
|
**Trait**: Stackable
|
|
**Description**: Push current stack depth onto the stack.
|
|
**Example**:
|
|
```
|
|
1 2 3 depth // Returns 1 2 3 3
|
|
```
|
|
**See Also**: [pick](#pick), [roll](#roll)
|
|
|
|
#### drop
|
|
**Signature**: `(Self --)`
|
|
**Trait**: Stackable
|
|
**Description**: Remove and discard the top item from the stack.
|
|
**Example**:
|
|
```
|
|
5 10 drop // Returns 5
|
|
```
|
|
**See Also**: [dup](#dup), [swap](#swap)
|
|
|
|
#### dup
|
|
**Signature**: `(Self -- Self Self)`
|
|
**Trait**: Stackable
|
|
**Description**: Duplicate the top item on the stack.
|
|
**Example**:
|
|
```
|
|
5 dup // Returns 5 5
|
|
```
|
|
**See Also**: [drop](#drop), [over](#over)
|
|
|
|
#### each
|
|
**Signature**: `(ArrayOf<T> TokenString --)`
|
|
**Description**: Apply function to each element (side effects).
|
|
**Example**:
|
|
```
|
|
[1 2 3] { print } each // Prints 1, 2, 3
|
|
```
|
|
**See Also**: [map](#map), [filter](#filter)
|
|
|
|
#### ends_with
|
|
**Signature**: `(String String -- bool)`
|
|
**Trait**: String
|
|
**Description**: Check if string ends with given suffix.
|
|
**Example**:
|
|
```
|
|
"hello" "lo" ends_with // Returns true
|
|
"hello" "he" ends_with // Returns false
|
|
```
|
|
**See Also**: [starts_with](#starts_with), [find](#find)
|
|
|
|
#### enumerate
|
|
**Signature**: `(ArrayOf<T> -- ArrayOf<Pair<Size T>>)`
|
|
**Description**: Add indices to array elements.
|
|
**Example**:
|
|
```
|
|
["a" "b" "c"] enumerate // Returns [[0 "a"] [1 "b"] [2 "c"]]
|
|
```
|
|
**See Also**: [zip](#zip), [map](#map)
|
|
|
|
#### eval
|
|
**Signature**: `(TokenString --)`
|
|
**Trait**: Implementable
|
|
**Description**: Parse and execute TokenString as code.
|
|
**Example**:
|
|
```
|
|
"2 3 +" eval // Returns 5
|
|
```
|
|
**See Also**: [lambda](#lambda)
|
|
|
|
#### filter
|
|
**Signature**: `(ArrayOf<T> TokenString -- ArrayOf<T>)`
|
|
**Description**: Keep only elements matching predicate.
|
|
**Example**:
|
|
```
|
|
[1 2 3 4 5] { 2 % 0 == } filter // Returns [2 4]
|
|
```
|
|
**See Also**: [map](#map), [reduce](#reduce)
|
|
|
|
#### find
|
|
**Signature**: `(String String -- Option<Size>)`
|
|
**Trait**: String
|
|
**Description**: Find position of substring, returns Option::Some(index) or Option::None.
|
|
**Example**:
|
|
```
|
|
"hello world" "world" find // Returns Option::Some(6)
|
|
"hello world" "xyz" find // Returns Option::None
|
|
```
|
|
**See Also**: [starts_with](#starts_with), [ends_with](#ends_with)
|
|
|
|
#### floor
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Round number down to nearest integer.
|
|
**Example**:
|
|
```
|
|
3.14 floor // Returns 3.0
|
|
-2.7 floor // Returns -3.0
|
|
```
|
|
**See Also**: [ceil](#ceil), [round](#round)
|
|
|
|
#### foldl
|
|
**Signature**: `(ArrayOf<T> U TokenString -- U)`
|
|
**Description**: Left fold array with accumulator function.
|
|
**Example**:
|
|
```
|
|
[1 2 3 4] 0 { + } foldl // Returns 10
|
|
```
|
|
**See Also**: [foldr](#foldr), [reduce](#reduce)
|
|
|
|
#### foldr
|
|
**Signature**: `(ArrayOf<T> U TokenString -- U)`
|
|
**Description**: Right fold array with accumulator function.
|
|
**Example**:
|
|
```
|
|
[1 2 3 4] 0 { + } foldr // Returns 10
|
|
```
|
|
**See Also**: [foldl](#foldl), [reduce](#reduce)
|
|
|
|
#### format
|
|
**Signature**: `(String Iterable<Stringifiable> -- String)`
|
|
**Trait**: String
|
|
**Description**: Format string with values, replacing %d, %s, %f placeholders.
|
|
**Example**:
|
|
```
|
|
"x=%d, y=%d" [5 10] format // Returns "x=5, y=10"
|
|
"Hello %s" ["World"] format // Returns "Hello World"
|
|
```
|
|
**See Also**: [to_str](#to_str), [concat](#concat)
|
|
|
|
#### implements
|
|
**Signature**: `(Self Identifier -- bool)`
|
|
**Description**: Check if value's type implements a specific trait.
|
|
**Example**:
|
|
```
|
|
42 ::Addable implements // Returns true
|
|
"hello" ::String implements // Returns true
|
|
```
|
|
**See Also**: [type_of](#type_of), [assert](#assert)
|
|
|
|
#### input
|
|
**Signature**: `(String -- String)`
|
|
**Description**: Print prompt and read line from stdin.
|
|
**Example**:
|
|
```
|
|
"Enter name: " input // Prompts and returns user input
|
|
```
|
|
**See Also**: [print](#print), [read](#read)
|
|
|
|
#### join
|
|
**Signature**: `(ArrayOf<String> String -- String)`
|
|
**Description**: Join array of strings with delimiter.
|
|
**Example**:
|
|
```
|
|
["a" "b" "c"] "," join // Returns "a,b,c"
|
|
```
|
|
**See Also**: [split](#split), [concat](#concat)
|
|
|
|
#### lambda
|
|
**Signature**: `(TokenString -- Callable)`
|
|
**Trait**: Implementable
|
|
**Description**: Convert TokenString to callable code block.
|
|
**Example**:
|
|
```
|
|
{ dup * } lambda ::square swap
|
|
5 square eval // Returns 25
|
|
```
|
|
**See Also**: [eval](#eval)
|
|
|
|
#### length
|
|
**Signature**: `(Sized -- i64)`
|
|
**Trait**: Sized
|
|
**Description**: Get the number of elements in a container.
|
|
**Example**:
|
|
```
|
|
[1 2 3 4 5] length // Returns 5
|
|
"hello" length // Returns 5
|
|
```
|
|
**See Also**: [at](#at), [slice](#slice)
|
|
|
|
#### map
|
|
**Signature**: `(ArrayOf<T> TokenString -- ArrayOf<U>)`
|
|
**Description**: Transform each element with function.
|
|
**Example**:
|
|
```
|
|
[1 2 3 4] { 2 * } map // Returns [2 4 6 8]
|
|
```
|
|
**See Also**: [filter](#filter), [reduce](#reduce), [each](#each)
|
|
|
|
#### max
|
|
**Signature**: `(Math Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Return the maximum of two values.
|
|
**Example**:
|
|
```
|
|
3 5 max // Returns 5
|
|
-2 1 max // Returns 1
|
|
```
|
|
**See Also**: [min](#min), [abs](#abs)
|
|
|
|
#### mean
|
|
**Signature**: `(ArrayOf<Number> -- f64)`
|
|
**Description**: Calculate the average of numeric array elements.
|
|
**Example**:
|
|
```
|
|
[1 2 3 4 5] mean // Returns 3.0
|
|
```
|
|
**See Also**: [sum](#sum), [reduce](#reduce)
|
|
|
|
#### min
|
|
**Signature**: `(Math Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Return the minimum of two values.
|
|
**Example**:
|
|
```
|
|
3 5 min // Returns 3
|
|
-2 1 min // Returns -2
|
|
```
|
|
**See Also**: [max](#max), [abs](#abs)
|
|
|
|
#### over
|
|
**Signature**: `(Self Self -- Self Self Self)`
|
|
**Trait**: Stackable
|
|
**Description**: Copy the second item to the top of the stack.
|
|
**Example**:
|
|
```
|
|
5 10 over // Returns 5 10 5
|
|
```
|
|
**See Also**: [dup](#dup), [swap](#swap), [rot](#rot)
|
|
|
|
#### parse
|
|
**Signature**: `(String -- Parseable)`
|
|
**Trait**: Parseable
|
|
**Description**: Parse string to value of inferred type.
|
|
**Example**:
|
|
```
|
|
"123" parse // Returns 123 (as appropriate numeric type)
|
|
```
|
|
**See Also**: [to_str](#to_str)
|
|
|
|
#### pick
|
|
**Signature**: `(Size -- Self)`
|
|
**Trait**: Stackable
|
|
**Description**: Copy nth item to top (0 = top, 1 = second, etc.).
|
|
**Example**:
|
|
```
|
|
1 2 3 4 2 pick // Returns 1 2 3 4 2
|
|
```
|
|
**See Also**: [roll](#roll), [depth](#depth)
|
|
|
|
#### print
|
|
**Signature**: `(Stringifiable --)`
|
|
**Description**: Print value to stdout.
|
|
**Example**:
|
|
```
|
|
"Hello" print // Prints: Hello
|
|
42 print // Prints: 42
|
|
```
|
|
**See Also**: [input](#input), [to_str](#to_str)
|
|
|
|
#### rand
|
|
**Signature**: `(-- f64)`
|
|
**Description**: Generate random f64 in range [0.0, 1.0).
|
|
**Example**:
|
|
```
|
|
rand // Returns 0.7234... (random value)
|
|
100 rand * // Random value 0.0-99.999...
|
|
```
|
|
**See Also**: [seed](#seed)
|
|
|
|
#### read
|
|
**Signature**: `(String -- String)`
|
|
**Description**: Read file contents as string.
|
|
**Example**:
|
|
```
|
|
"file.txt" read // Returns file contents
|
|
```
|
|
**See Also**: [write](#write)
|
|
|
|
#### reduce
|
|
**Signature**: `(ArrayOf<T> T TokenString -- T)`
|
|
**Description**: Fold array with accumulator function.
|
|
**Example**:
|
|
```
|
|
[1 2 3 4] 0 { + } reduce // Returns 10
|
|
```
|
|
**See Also**: [map](#map), [filter](#filter), [foldl](#foldl)
|
|
|
|
#### replace
|
|
**Signature**: `(String String String -- String)`
|
|
**Trait**: String
|
|
**Description**: Replace all occurrences of substring with replacement.
|
|
**Example**:
|
|
```
|
|
"hello world" "world" "Stack" replace // Returns "hello Stack"
|
|
```
|
|
**See Also**: [split](#split), [concat](#concat)
|
|
|
|
#### reverse
|
|
**Signature**: `(ArrayOf<T> -- ArrayOf<T>)`
|
|
**Description**: Reverse order of array elements.
|
|
**Example**:
|
|
```
|
|
[1 2 3] reverse // Returns [3 2 1]
|
|
```
|
|
**See Also**: [transpose](#transpose)
|
|
|
|
#### roll
|
|
**Signature**: `(Size Size --)`
|
|
**Trait**: Stackable
|
|
**Description**: Rotate n items, times times.
|
|
**Example**:
|
|
```
|
|
1 2 3 4 3 1 roll // Rotates top 3 once: 1 3 4 2
|
|
```
|
|
**See Also**: [rot](#rot), [pick](#pick)
|
|
|
|
#### rot
|
|
**Signature**: `(Self Self Self -- Self Self Self)`
|
|
**Trait**: Stackable
|
|
**Description**: Rotate the top three items.
|
|
**Example**:
|
|
```
|
|
1 2 3 rot // Returns 2 3 1
|
|
```
|
|
**See Also**: [swap](#swap), [roll](#roll)
|
|
|
|
#### round
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Round number to nearest integer.
|
|
**Example**:
|
|
```
|
|
3.14 round // Returns 3.0
|
|
3.7 round // Returns 4.0
|
|
```
|
|
**See Also**: [floor](#floor), [ceil](#ceil)
|
|
|
|
#### seed
|
|
**Signature**: `(u64 --)`
|
|
**Description**: Seed the random number generator with specific value.
|
|
**Example**:
|
|
```
|
|
12345 seed // Seed RNG for deterministic results
|
|
rand // Returns deterministic value
|
|
```
|
|
**See Also**: [rand](#rand)
|
|
|
|
#### sin
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate sine of angle in radians.
|
|
**Example**:
|
|
```
|
|
0.0 sin // Returns 0.0
|
|
1.5708 sin // Returns ~1.0 (pi/2)
|
|
```
|
|
**See Also**: [cos](#cos), [tan](#tan), [asin](#asin)
|
|
|
|
#### slice
|
|
**Signature**: `(Sliceable Size Size -- Sliceable)`
|
|
**Trait**: Sliceable
|
|
**Description**: Extract elements from start to end index.
|
|
**Example**:
|
|
```
|
|
[10 20 30 40] 1 3 slice // Returns [20 30]
|
|
```
|
|
**See Also**: [at](#at), [length](#length)
|
|
|
|
#### split
|
|
**Signature**: `(String String -- ArrayOf<String>)`
|
|
**Trait**: String
|
|
**Description**: Split string by delimiter.
|
|
**Example**:
|
|
```
|
|
"a,b,c" "," split // Returns ["a" "b" "c"]
|
|
```
|
|
**See Also**: [join](#join), [substr](#substr)
|
|
|
|
#### sqrt
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate square root.
|
|
**Example**:
|
|
```
|
|
16 sqrt // Returns 4.0
|
|
2.0 sqrt // Returns ~1.414
|
|
```
|
|
**See Also**: [^](#operator-exponent)
|
|
|
|
#### starts_with
|
|
**Signature**: `(String String -- bool)`
|
|
**Trait**: String
|
|
**Description**: Check if string starts with given prefix.
|
|
**Example**:
|
|
```
|
|
"hello" "hel" starts_with // Returns true
|
|
"hello" "lo" starts_with // Returns false
|
|
```
|
|
**See Also**: [ends_with](#ends_with), [find](#find)
|
|
|
|
#### substr
|
|
**Signature**: `(String Size Size -- String)`
|
|
**Trait**: String
|
|
**Description**: Extract substring from start to end index.
|
|
**Example**:
|
|
```
|
|
"hello" 1 3 substr // Returns "el"
|
|
```
|
|
**See Also**: [slice](#slice), [split](#split)
|
|
|
|
#### sum
|
|
**Signature**: `(ArrayOf<Number> -- Number)`
|
|
**Description**: Sum all numeric elements in array.
|
|
**Example**:
|
|
```
|
|
[1 2 3 4 5] sum // Returns 15
|
|
```
|
|
**See Also**: [mean](#mean), [reduce](#reduce)
|
|
|
|
#### swap
|
|
**Signature**: `(Self Self -- Self Self)`
|
|
**Trait**: Stackable
|
|
**Description**: Swap the top two items on the stack.
|
|
**Example**:
|
|
```
|
|
5 10 swap // Returns 10 5
|
|
```
|
|
**See Also**: [dup](#dup), [rot](#rot)
|
|
|
|
#### tan
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate tangent of angle in radians.
|
|
**Example**:
|
|
```
|
|
0.0 tan // Returns 0.0
|
|
0.7854 tan // Returns ~1.0 (pi/4)
|
|
```
|
|
**See Also**: [sin](#sin), [cos](#cos), [atan](#atan)
|
|
|
|
#### to_f32, to_f64
|
|
**Signature**: `(Convertible -- f32/f64)`
|
|
**Trait**: Convertible
|
|
**Description**: Convert value to 32-bit or 64-bit float.
|
|
**Example**:
|
|
```
|
|
42 to_f64 // Returns 42.0
|
|
```
|
|
**See Also**: [to_i8, to_i16, to_i32, to_i64](#to_i8-to_i16-to_i32-to_i64), [to_u8, to_u16, to_u32, to_u64](#to_u8-to_u16-to_u32-to_u64)
|
|
|
|
#### to_i8, to_i16, to_i32, to_i64
|
|
**Signature**: `(Convertible -- i8/i16/i32/i64)`
|
|
**Trait**: Convertible
|
|
**Description**: Convert value to signed integer type.
|
|
**Example**:
|
|
```
|
|
3.14 to_i32 // Returns 3 (truncates)
|
|
```
|
|
**See Also**: [to_u8, to_u16, to_u32, to_u64](#to_u8-to_u16-to_u32-to_u64), [to_f32, to_f64](#to_f32-to_f64)
|
|
|
|
#### to_str
|
|
**Signature**: `(Stringifiable -- String)`
|
|
**Trait**: Stringifiable
|
|
**Description**: Convert value to string representation.
|
|
**Example**:
|
|
```
|
|
42 to_str // Returns "42"
|
|
```
|
|
**See Also**: [parse](#parse), [print](#print)
|
|
|
|
#### to_u8, to_u16, to_u32, to_u64
|
|
**Signature**: `(Convertible -- u8/u16/u32/u64)`
|
|
**Trait**: Convertible
|
|
**Description**: Convert value to unsigned integer type.
|
|
**Example**:
|
|
```
|
|
42 to_u32 // Returns 42 (as u32)
|
|
```
|
|
**See Also**: [to_i8, to_i16, to_i32, to_i64](#to_i8-to_i16-to_i32-to_i64), [to_f32, to_f64](#to_f32-to_f64)
|
|
|
|
#### transpose
|
|
**Signature**: `(ArrayOf<ArrayOf<T>> -- ArrayOf<ArrayOf<T>>)`
|
|
**Description**: Transpose a 2D array (swap rows and columns).
|
|
**Example**:
|
|
```
|
|
[[1 2] [3 4]] transpose // Returns [[1 3] [2 4]]
|
|
```
|
|
**See Also**: [reverse](#reverse)
|
|
|
|
#### trim
|
|
**Signature**: `(String -- String)`
|
|
**Trait**: String
|
|
**Description**: Remove leading and trailing whitespace.
|
|
**Example**:
|
|
```
|
|
" hello " trim // Returns "hello"
|
|
```
|
|
**See Also**: [split](#split), [replace](#replace)
|
|
|
|
#### type_of
|
|
**Signature**: `(Self -- Identifier)`
|
|
**Description**: Return the type of a value as an identifier literal.
|
|
**Example**:
|
|
```
|
|
42 type_of // Returns ::i64
|
|
"hello" type_of // Returns ::String
|
|
```
|
|
**See Also**: [implements](#implements), [assert](#assert)
|
|
|
|
#### window
|
|
**Signature**: `(ArrayOf<T> Size -- ArrayOf<ArrayOf<T>>)`
|
|
**Description**: Create sliding windows of given size.
|
|
**Example**:
|
|
```
|
|
[1 2 3 4] 2 window // Returns [[1 2] [2 3] [3 4]]
|
|
```
|
|
**See Also**: [slice](#slice)
|
|
|
|
#### write
|
|
**Signature**: `(String String --)`
|
|
**Description**: Write string to file.
|
|
**Example**:
|
|
```
|
|
"data" "file.txt" write // Writes "data" to file.txt
|
|
```
|
|
**See Also**: [read](#read)
|
|
|
|
#### zip
|
|
**Signature**: `(ArrayOf<T> ArrayOf<U> -- ArrayOf<Pair<T U>>)`
|
|
**Description**: Combine two arrays element-wise into pairs.
|
|
**Example**:
|
|
```
|
|
[1 2 3] [4 5 6] zip // Returns [[1 4] [2 5] [3 6]]
|
|
```
|
|
**See Also**: [enumerate](#enumerate), [map](#map)
|
|
|
|
---
|
|
|
|
## Appendix B: Complete Trait Reference
|
|
|
|
This appendix contains all built-in trait definitions with complete documentation, organized alphabetically.
|
|
|
|
### Trait List
|
|
|
|
- Addable
|
|
- ArrayOf<T>
|
|
- Bitwise
|
|
- Comparable
|
|
- Concatenable
|
|
- Convertible
|
|
- Equatable
|
|
- Exponentiable
|
|
- Identifier
|
|
- Implementable
|
|
- Iterable<T>
|
|
- Logarithmic
|
|
- Logical
|
|
- Math
|
|
- Multiplyable
|
|
- Number
|
|
- Orderable
|
|
- Parseable
|
|
- Selectable<T>
|
|
- Size
|
|
- Sized
|
|
- Sliceable
|
|
- Stackable
|
|
- String
|
|
- Stringifiable
|
|
|
|
### Addable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self Self -- Self) +:
|
|
(Self Self -- Self) -:
|
|
} ::Addable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### +:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Add two values together.
|
|
**Example**: `3 4 + // => 7`
|
|
|
|
#### -:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Subtract second value from first.
|
|
**Example**: `10 3 - // => 7`
|
|
|
|
**Standard Implementations**: All numeric types (i8, i16, i32, i64, u8, u16, u32, u64, f32, f64)
|
|
|
|
**Related Traits**: Multiplyable, Number, Math
|
|
|
|
**See Also**: Section 4.2 (Arithmetic Operators)
|
|
|
|
### ArrayOf<T>
|
|
|
|
**Generic Parameters**: T (element type)
|
|
**Inherits**: Sized, Selectable<T>, Sliceable
|
|
|
|
**Definition**:
|
|
```
|
|
[ ::Sized ::Selectable<T> ::Sliceable ] ::ArrayOf<T> inher
|
|
{ } ::ArrayOf<T> trait
|
|
```
|
|
|
|
**Description**: Composite trait for arrays, inheriting all container operations.
|
|
|
|
**Standard Implementations**: Array types
|
|
|
|
**Related Traits**: Sized, Selectable, Sliceable, Iterable
|
|
|
|
**See Also**: Section 7.4 (Arrays)
|
|
|
|
### Bitwise
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self Self -- Self) bitand:
|
|
(Self Self -- Self) bitor:
|
|
(Self Self -- Self) bitxor:
|
|
(Self -- Self) bitnot:
|
|
(Self Size -- Self) shl:
|
|
(Self Size -- Self) shr:
|
|
} ::Bitwise trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### bitand:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Bitwise AND of two values.
|
|
**Example**: `0xFF 0x0F bitand // => 0x0F`
|
|
|
|
#### bitor:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Bitwise OR of two values.
|
|
**Example**: `0xF0 0x0F bitor // => 0xFF`
|
|
|
|
#### bitxor:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Bitwise XOR of two values.
|
|
**Example**: `0xFF 0x0F bitxor // => 0xF0`
|
|
|
|
#### bitnot:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Bitwise NOT (complement) of value.
|
|
**Example**: `0xFF bitnot // => (inverted bits)`
|
|
|
|
#### shl:
|
|
**Signature**: `(Self Size -- Self)`
|
|
**Description**: Shift bits left by n positions.
|
|
**Example**: `4 2 shl // => 16`
|
|
|
|
#### shr:
|
|
**Signature**: `(Self Size -- Self)`
|
|
**Description**: Shift bits right by n positions.
|
|
**Example**: `16 2 shr // => 4`
|
|
|
|
**Standard Implementations**: Integer types (i8, i16, i32, i64, u8, u16, u32, u64)
|
|
|
|
**Related Traits**: None
|
|
|
|
**See Also**: Section 4.5 (Bitwise Operators)
|
|
|
|
### Comparable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: Orderable, Equatable
|
|
|
|
**Definition**:
|
|
```
|
|
[ ::Orderable ::Equatable ] ::Comparable inher
|
|
{ } ::Comparable trait
|
|
```
|
|
|
|
**Description**: Composite trait combining ordering and equality comparisons.
|
|
|
|
**Standard Implementations**: All numeric types, strings, characters
|
|
|
|
**Related Traits**: Orderable, Equatable, Size, Number
|
|
|
|
**See Also**: Section 4.3 (Comparison Operators)
|
|
|
|
### Concatenable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self Self -- Self) concat:
|
|
} ::Concatenable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### concat:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Join two containers or strings together.
|
|
**Example**: `"hello" " world" concat // => "hello world"`
|
|
|
|
**Standard Implementations**: Arrays, strings
|
|
|
|
**Related Traits**: String, ArrayOf
|
|
|
|
**See Also**: Section 7.4 (Arrays), Appendix A (concat)
|
|
|
|
### Convertible
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self -- i8) to_i8:
|
|
(Self -- i16) to_i16:
|
|
(Self -- i32) to_i32:
|
|
(Self -- i64) to_i64:
|
|
(Self -- u8) to_u8:
|
|
(Self -- u16) to_u16:
|
|
(Self -- u32) to_u32:
|
|
(Self -- u64) to_u64:
|
|
(Self -- f32) to_f32:
|
|
(Self -- f64) to_f64:
|
|
} ::Convertible trait
|
|
```
|
|
|
|
**Methods**: Provides explicit type conversion methods to all numeric types.
|
|
|
|
**Standard Implementations**: All numeric types
|
|
|
|
**Related Traits**: Stringifiable, Parseable, Size
|
|
|
|
**See Also**: Section 11.5 (Type Conversion)
|
|
|
|
### Equatable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self Self -- bool) ==:
|
|
(Self Self -- bool) !=:
|
|
} ::Equatable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### ==:
|
|
**Signature**: `(Self Self -- bool)`
|
|
**Description**: Test if two values are equal.
|
|
**Example**: `5 5 == // => true`
|
|
|
|
#### !=:
|
|
**Signature**: `(Self Self -- bool)`
|
|
**Description**: Test if two values are not equal.
|
|
**Example**: `5 3 != // => true`
|
|
|
|
**Standard Implementations**: All types
|
|
|
|
**Related Traits**: Orderable, Comparable
|
|
|
|
**See Also**: Section 4.3 (Comparison Operators)
|
|
|
|
### Exponentiable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self Self -- Self) ^:
|
|
} ::Exponentiable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### ^:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Raise first value to the power of the second.
|
|
**Example**: `2 8 ^ // => 256`
|
|
|
|
**Standard Implementations**: Numeric types
|
|
|
|
**Related Traits**: Addable, Multiplyable, Number, Math
|
|
|
|
**See Also**: Section 4.2 (Arithmetic Operators)
|
|
|
|
### Identifier
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{ } ::Identifier trait
|
|
```
|
|
|
|
**Description**: Marker trait for identifier types.
|
|
|
|
**Standard Implementations**: Identifier literals
|
|
|
|
**Related Traits**: Implementable
|
|
|
|
**See Also**: Section 11.2 (Identifier Literals)
|
|
|
|
### Implementable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(TokenString Identifier --) trait:
|
|
(Identifier TokenString Identifier --) impl:
|
|
(ArrayOf<Identifier> Identifier --) inher:
|
|
} ::Implementable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### trait:
|
|
**Signature**: `(TokenString Identifier --)`
|
|
**Description**: Define a new trait.
|
|
**Example**: `{ (Self -- ) draw: } ::Drawable trait`
|
|
|
|
#### impl:
|
|
**Signature**: `(Identifier TokenString Identifier --)`
|
|
**Description**: Implement a trait for a type.
|
|
**Example**: `::Drawable { ... } ::Rectangle impl`
|
|
|
|
#### inher:
|
|
**Signature**: `(ArrayOf<Identifier> Identifier --)`
|
|
**Description**: Declare trait inheritance.
|
|
**Example**: `[ ::Orderable ::Equatable ] ::Comparable inher`
|
|
|
|
**Standard Implementations**: Language-level operators
|
|
|
|
**Related Traits**: Identifier
|
|
|
|
**See Also**: Section 9 (Trait System)
|
|
|
|
### Iterable<T>
|
|
|
|
**Generic Parameters**: T (element type)
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self -- Self Option<T>) next:
|
|
} ::Iterable<T> trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### next:
|
|
**Signature**: `(Self -- Self Option<T>)`
|
|
**Description**: Get next item from iterator.
|
|
**Example**: Iterator protocol for collections
|
|
|
|
**Standard Implementations**: Arrays, ranges, iterators
|
|
|
|
**Related Traits**: ArrayOf, Selectable
|
|
|
|
**See Also**: Section 8.3 (Type Tuples - Variable Arguments)
|
|
|
|
### Logarithmic
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self Self -- Self) logb:
|
|
(Self -- Self) log:
|
|
(Self -- Self) ln:
|
|
} ::Logarithmic trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### logb:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Logarithm with custom base.
|
|
**Example**: `8 2 logb // => 3.0`
|
|
|
|
#### log:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Logarithm base 10.
|
|
**Example**: `100 log // => 2.0`
|
|
|
|
#### ln:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Natural logarithm (base e).
|
|
**Example**: `2.718 ln // => 1.0`
|
|
|
|
**Standard Implementations**: Floating point types
|
|
|
|
**Related Traits**: Exponentiable, Number, Math
|
|
|
|
**See Also**: Section 4.2 (Arithmetic Operators)
|
|
|
|
### Logical
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self -- bool) truthy:
|
|
(Self Self -- Self) and:
|
|
(Self Self -- Self) or:
|
|
(Self -- Self) not:
|
|
} ::Logical trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### truthy:
|
|
**Signature**: `(Self -- bool)`
|
|
**Description**: Convert to boolean (truthiness check).
|
|
**Example**: `5 truthy // => true`, `0 truthy // => false`
|
|
|
|
#### and:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Logical AND - returns first if falsy, else second.
|
|
**Example**: `true false and // => false`
|
|
|
|
#### or:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Logical OR - returns first if truthy, else second.
|
|
**Example**: `true false or // => true`
|
|
|
|
#### not:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Logical NOT - inverts truthiness.
|
|
**Example**: `false not // => true`
|
|
|
|
**Standard Implementations**: bool, numbers, Option, Result
|
|
|
|
**Related Traits**: None
|
|
|
|
**See Also**: Section 4.4 (Logical Operators)
|
|
|
|
### Math
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self -- Self) sqrt:
|
|
(Self -- Self) abs:
|
|
(Self -- Self) sin:
|
|
(Self -- Self) cos:
|
|
(Self -- Self) tan:
|
|
(Self -- Self) asin:
|
|
(Self -- Self) acos:
|
|
(Self -- Self) atan:
|
|
(Self Self -- Self) atan2:
|
|
(Self -- Self) floor:
|
|
(Self -- Self) ceil:
|
|
(Self -- Self) round:
|
|
(Self Self -- Self) min:
|
|
(Self Self -- Self) max:
|
|
} ::Math trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### sqrt:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Calculate square root.
|
|
**Example**: `16 sqrt // => 4.0`
|
|
|
|
#### abs:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Return absolute value.
|
|
**Example**: `-42 abs // => 42`
|
|
|
|
#### sin:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Calculate sine (radians).
|
|
**Example**: `0.0 sin // => 0.0`
|
|
|
|
#### cos:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Calculate cosine (radians).
|
|
**Example**: `0.0 cos // => 1.0`
|
|
|
|
#### tan:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Calculate tangent (radians).
|
|
**Example**: `0.0 tan // => 0.0`
|
|
|
|
#### asin:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Calculate arc sine (radians).
|
|
**Example**: `1.0 asin // => ~1.5708`
|
|
|
|
#### acos:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Calculate arc cosine (radians).
|
|
**Example**: `1.0 acos // => 0.0`
|
|
|
|
#### atan:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Calculate arc tangent (radians).
|
|
**Example**: `1.0 atan // => ~0.7854`
|
|
|
|
#### atan2:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Two-argument arc tangent.
|
|
**Example**: `1.0 1.0 atan2 // => ~0.7854`
|
|
|
|
#### floor:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Round down to nearest integer.
|
|
**Example**: `3.14 floor // => 3.0`
|
|
|
|
#### ceil:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Round up to nearest integer.
|
|
**Example**: `3.14 ceil // => 4.0`
|
|
|
|
#### round:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Round to nearest integer.
|
|
**Example**: `3.7 round // => 4.0`
|
|
|
|
#### min:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Return minimum of two values.
|
|
**Example**: `3 5 min // => 3`
|
|
|
|
#### max:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Return maximum of two values.
|
|
**Example**: `3 5 max // => 5`
|
|
|
|
**Standard Implementations**: Numeric types (especially floating point)
|
|
|
|
**Related Traits**: Number, Addable, Multiplyable, Exponentiable, Logarithmic
|
|
|
|
**See Also**: Section 4.2 (Arithmetic Operators), Section 4.6 (Randomness)
|
|
|
|
### Multiplyable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self Self -- Self) *:
|
|
(Self Self -- Self) /:
|
|
(Self Self -- Self) %:
|
|
} ::Multiplyable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### *:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Multiply two values.
|
|
**Example**: `5 6 * // => 30`
|
|
|
|
#### /:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Divide first value by second.
|
|
**Example**: `20 4 / // => 5`
|
|
|
|
#### %:
|
|
**Signature**: `(Self Self -- Self)`
|
|
**Description**: Remainder after division (modulo).
|
|
**Example**: `17 5 % // => 2`
|
|
|
|
**Standard Implementations**: All numeric types
|
|
|
|
**Related Traits**: Addable, Exponentiable, Number, Math
|
|
|
|
**See Also**: Section 4.2 (Arithmetic Operators)
|
|
|
|
### Number
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: Addable, Multiplyable, Exponentiable, Comparable, Logarithmic
|
|
|
|
**Definition**:
|
|
```
|
|
[ ::Addable ::Multiplyable ::Exponentiable ::Comparable ::Logarithmic ] ::Number inher
|
|
{ } ::Number trait
|
|
```
|
|
|
|
**Description**: Composite trait representing the full suite of numeric operations.
|
|
|
|
**Standard Implementations**: All numeric types (i8, i16, i32, i64, u8, u16, u32, u64, f32, f64)
|
|
|
|
**Related Traits**: Addable, Multiplyable, Exponentiable, Comparable, Logarithmic, Math
|
|
|
|
**See Also**: Section 4.2 (Arithmetic Operators)
|
|
|
|
### Orderable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self Self -- bool) >:
|
|
(Self Self -- bool) >=:
|
|
(Self Self -- bool) <:
|
|
(Self Self -- bool) <=:
|
|
} ::Orderable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### >:
|
|
**Signature**: `(Self Self -- bool)`
|
|
**Description**: True if first value is greater than second.
|
|
**Example**: `5 3 > // => true`
|
|
|
|
#### >=:
|
|
**Signature**: `(Self Self -- bool)`
|
|
**Description**: True if first value is greater than or equal to second.
|
|
**Example**: `5 5 >= // => true`
|
|
|
|
#### <:
|
|
**Signature**: `(Self Self -- bool)`
|
|
**Description**: True if first value is less than second.
|
|
**Example**: `3 5 < // => true`
|
|
|
|
#### <=:
|
|
**Signature**: `(Self Self -- bool)`
|
|
**Description**: True if first value is less than or equal to second.
|
|
**Example**: `5 5 <= // => true`
|
|
|
|
**Standard Implementations**: All numeric types, strings, characters
|
|
|
|
**Related Traits**: Equatable, Comparable
|
|
|
|
**See Also**: Section 4.3 (Comparison Operators)
|
|
|
|
### Parseable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(String -- Self) parse:
|
|
} ::Parseable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### parse:
|
|
**Signature**: `(String -- Self)`
|
|
**Description**: Parse string to value of this type.
|
|
**Example**: `"123" parse // => 123`
|
|
|
|
**Standard Implementations**: All numeric types, bool
|
|
|
|
**Related Traits**: Stringifiable, Convertible
|
|
|
|
**See Also**: Appendix A (parse)
|
|
|
|
### Selectable<T>
|
|
|
|
**Generic Parameters**: T (element type)
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self Size -- T) at:
|
|
} ::Selectable<T> trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### at:
|
|
**Signature**: `(Self Size -- T)`
|
|
**Description**: Access element at given index.
|
|
**Example**: `[10 20 30] 1 at // => 20`
|
|
|
|
**Standard Implementations**: Arrays, strings
|
|
|
|
**Related Traits**: ArrayOf, Sized, Sliceable
|
|
|
|
**See Also**: Section 7.4 (Arrays)
|
|
|
|
### Size
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: Addable, Comparable, Convertible
|
|
|
|
**Definition**:
|
|
```
|
|
[ ::Addable ::Comparable ::Convertible ] ::Size inher
|
|
{ } ::Size trait
|
|
```
|
|
|
|
**Description**: Represents types suitable for indexing and sizing operations.
|
|
|
|
**Standard Implementations**: All integer types (i8, i16, i32, i64, u8, u16, u32, u64)
|
|
|
|
**Related Traits**: Addable, Comparable, Convertible
|
|
|
|
**See Also**: Section 4.1 (Stack Operations - pick, roll)
|
|
|
|
### Sized
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self -- i64) length:
|
|
} ::Sized trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### length:
|
|
**Signature**: `(Self -- i64)`
|
|
**Description**: Get the number of elements in a container.
|
|
**Example**: `[1 2 3 4 5] length // => 5`
|
|
|
|
**Standard Implementations**: Arrays, strings
|
|
|
|
**Related Traits**: ArrayOf, Selectable, Sliceable
|
|
|
|
**See Also**: Section 7.4 (Arrays)
|
|
|
|
### Sliceable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self Size Size -- Self) slice:
|
|
} ::Sliceable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### slice:
|
|
**Signature**: `(Self Size Size -- Self)`
|
|
**Description**: Extract elements from start to end index.
|
|
**Example**: `[10 20 30 40] 1 3 slice // => [20 30]`
|
|
|
|
**Standard Implementations**: Arrays, strings
|
|
|
|
**Related Traits**: ArrayOf, Sized, Selectable
|
|
|
|
**See Also**: Section 7.4 (Arrays)
|
|
|
|
### Stackable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self -- Self Self) dup:
|
|
(Self -- ) drop:
|
|
(Self Self -- Self Self) swap:
|
|
(Self Self -- Self Self Self) over:
|
|
(Self Self Self -- Self Self Self) rot:
|
|
(Size -- Self) pick:
|
|
(Size Size -- ) roll:
|
|
(-- Size) depth:
|
|
} ::Stackable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### dup:
|
|
**Signature**: `(Self -- Self Self)`
|
|
**Description**: Duplicate the top item on the stack.
|
|
**Example**: `5 dup // => 5 5`
|
|
|
|
#### drop:
|
|
**Signature**: `(Self -- )`
|
|
**Description**: Remove and discard the top item.
|
|
**Example**: `5 10 drop // => 5`
|
|
|
|
#### swap:
|
|
**Signature**: `(Self Self -- Self Self)`
|
|
**Description**: Swap the top two items.
|
|
**Example**: `5 10 swap // => 10 5`
|
|
|
|
#### over:
|
|
**Signature**: `(Self Self -- Self Self Self)`
|
|
**Description**: Copy the second item to the top.
|
|
**Example**: `5 10 over // => 5 10 5`
|
|
|
|
#### rot:
|
|
**Signature**: `(Self Self Self -- Self Self Self)`
|
|
**Description**: Rotate the top three items.
|
|
**Example**: `1 2 3 rot // => 2 3 1`
|
|
|
|
#### pick:
|
|
**Signature**: `(Size -- Self)`
|
|
**Description**: Copy nth item to top (0 = top).
|
|
**Example**: `1 2 3 4 2 pick // => 1 2 3 4 2`
|
|
|
|
#### roll:
|
|
**Signature**: `(Size Size -- )`
|
|
**Description**: Rotate n items, times times.
|
|
**Example**: `1 2 3 4 3 1 roll // => 1 3 4 2`
|
|
|
|
#### depth:
|
|
**Signature**: `(-- Size)`
|
|
**Description**: Push current stack depth.
|
|
**Example**: `1 2 3 depth // => 1 2 3 3`
|
|
|
|
**Standard Implementations**: All primitive types
|
|
|
|
**Related Traits**: None
|
|
|
|
**See Also**: Section 4.1 (Stack Operations)
|
|
|
|
### String
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: Concatenable
|
|
|
|
**Definition**:
|
|
```
|
|
[ ::Concatenable ] ::String inher
|
|
{
|
|
(Self Size Size -- Self) substr:
|
|
(Self Self -- ArrayOf<Self>) split:
|
|
(Self Self String -- Self) replace:
|
|
(Self -- Self) trim:
|
|
(Self Self -- Option<Size>) find:
|
|
(Self Self -- bool) starts_with:
|
|
(Self Self -- bool) ends_with:
|
|
} ::String trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### substr:
|
|
**Signature**: `(Self Size Size -- Self)`
|
|
**Description**: Extract substring from start to end index.
|
|
**Example**: `"hello" 1 3 substr // => "el"`
|
|
|
|
#### split:
|
|
**Signature**: `(Self Self -- ArrayOf<Self>)`
|
|
**Description**: Split string by delimiter.
|
|
**Example**: `"a,b,c" "," split // => ["a" "b" "c"]`
|
|
|
|
#### replace:
|
|
**Signature**: `(Self Self String -- Self)`
|
|
**Description**: Replace all occurrences of substring.
|
|
**Example**: `"hello world" "world" "Stack" replace // => "hello Stack"`
|
|
|
|
#### trim:
|
|
**Signature**: `(Self -- Self)`
|
|
**Description**: Remove leading and trailing whitespace.
|
|
**Example**: `" hello " trim // => "hello"`
|
|
|
|
#### find:
|
|
**Signature**: `(Self Self -- Option<Size>)`
|
|
**Description**: Find position of substring.
|
|
**Example**: `"hello world" "world" find // => Option::Some(6)`
|
|
|
|
#### starts_with:
|
|
**Signature**: `(Self Self -- bool)`
|
|
**Description**: Check if string starts with prefix.
|
|
**Example**: `"hello" "hel" starts_with // => true`
|
|
|
|
#### ends_with:
|
|
**Signature**: `(Self Self -- bool)`
|
|
**Description**: Check if string ends with suffix.
|
|
**Example**: `"hello" "lo" ends_with // => true`
|
|
|
|
**Standard Implementations**: String type
|
|
|
|
**Related Traits**: Concatenable, Sized, Sliceable
|
|
|
|
**See Also**: Section 11.5 (String Operations)
|
|
|
|
### Stringifiable
|
|
|
|
**Generic Parameters**: None
|
|
**Inherits**: None
|
|
|
|
**Definition**:
|
|
```
|
|
{
|
|
(Self -- String) to_str:
|
|
} ::Stringifiable trait
|
|
```
|
|
|
|
**Methods**:
|
|
|
|
#### to_str:
|
|
**Signature**: `(Self -- String)`
|
|
**Description**: Convert value to string representation.
|
|
**Example**: `42 to_str // => "42"`
|
|
|
|
**Standard Implementations**: All types
|
|
|
|
**Related Traits**: Parseable, Convertible
|
|
|
|
**See Also**: Section 11.5 (Type Conversion)
|
|
|
|
---
|
|
|
|
## Appendix C: Complete Operator Reference
|
|
|
|
This appendix provides a complete alphabetical reference of all operators in the language.
|
|
|
|
### Operator List
|
|
|
|
`!=`, `%`, `*`, `+`, `-`, `/`, `<`, `<=`, `==`, `>`, `>=`, `^`, `abs`, `acos`, `asin`, `assert`, `at`, `atan`, `atan2`, `bitand`, `bitnot`, `bitor`, `bitxor`, `break`, `ceil`, `concat`, `continue`, `cos`, `depth`, `drop`, `dup`, `each`, `ends_with`, `enum`, `enumerate`, `eval`, `filter`, `find`, `floor`, `foldl`, `foldr`, `for`, `format`, `get`, `if`, `impl`, `implements`, `inher`, `lambda`, `length`, `ln`, `log`, `logb`, `map`, `match`, `max`, `mean`, `min`, `not`, `or`, `over`, `pick`, `rand`, `reduce`, `replace`, `reverse`, `roll`, `rot`, `round`, `seed`, `set`, `shl`, `shr`, `sin`, `slice`, `split`, `sqrt`, `starts_with`, `struct`, `substr`, `sum`, `swap`, `tan`, `trait`, `transpose`, `trim`, `type_of`, `union`, `while`, `window`, `zip`
|
|
|
|
### Alphabetical Operator Reference
|
|
|
|
#### !=
|
|
**Operator Type**: Comparison
|
|
**Signature**: `(Equatable Equatable -- bool)`
|
|
**Trait**: Equatable
|
|
**Description**: Test if two values are not equal.
|
|
**Example**: `5 3 != // => true`
|
|
**See Also**: ==, <, >
|
|
**Section**: 4.3 (Comparison Operators)
|
|
|
|
#### %
|
|
**Operator Type**: Arithmetic
|
|
**Signature**: `(Multiplyable Multiplyable -- Multiplyable)`
|
|
**Trait**: Multiplyable
|
|
**Description**: Remainder after division (modulo).
|
|
**Example**: `17 5 % // => 2`
|
|
**See Also**: /, *
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### *
|
|
**Operator Type**: Arithmetic
|
|
**Signature**: `(Multiplyable Multiplyable -- Multiplyable)`
|
|
**Trait**: Multiplyable
|
|
**Description**: Multiply two values.
|
|
**Example**: `5 6 * // => 30`
|
|
**See Also**: /, +, -
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### +
|
|
**Operator Type**: Arithmetic
|
|
**Signature**: `(Addable Addable -- Addable)`
|
|
**Trait**: Addable
|
|
**Description**: Add two values.
|
|
**Example**: `3 4 + // => 7`
|
|
**See Also**: -, *, /
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### -
|
|
**Operator Type**: Arithmetic
|
|
**Signature**: `(Addable Addable -- Addable)`
|
|
**Trait**: Addable
|
|
**Description**: Subtract second value from first.
|
|
**Example**: `10 3 - // => 7`
|
|
**See Also**: +, *, /
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### /
|
|
**Operator Type**: Arithmetic
|
|
**Signature**: `(Multiplyable Multiplyable -- Multiplyable)`
|
|
**Trait**: Multiplyable
|
|
**Description**: Divide first value by second.
|
|
**Example**: `20 4 / // => 5`
|
|
**See Also**: *, %, +
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### <
|
|
**Operator Type**: Comparison
|
|
**Signature**: `(Orderable Orderable -- bool)`
|
|
**Trait**: Orderable
|
|
**Description**: True if first value is less than second.
|
|
**Example**: `3 5 < // => true`
|
|
**See Also**: <=, >, >=
|
|
**Section**: 4.3 (Comparison Operators)
|
|
|
|
#### <=
|
|
**Operator Type**: Comparison
|
|
**Signature**: `(Orderable Orderable -- bool)`
|
|
**Trait**: Orderable
|
|
**Description**: True if first value is less than or equal to second.
|
|
**Example**: `5 5 <= // => true`
|
|
**See Also**: <, >, >=
|
|
**Section**: 4.3 (Comparison Operators)
|
|
|
|
#### ==
|
|
**Operator Type**: Comparison
|
|
**Signature**: `(Equatable Equatable -- bool)`
|
|
**Trait**: Equatable
|
|
**Description**: Test if two values are equal.
|
|
**Example**: `5 5 == // => true`
|
|
**See Also**: !=, <, >
|
|
**Section**: 4.3 (Comparison Operators)
|
|
|
|
#### >
|
|
**Operator Type**: Comparison
|
|
**Signature**: `(Orderable Orderable -- bool)`
|
|
**Trait**: Orderable
|
|
**Description**: True if first value is greater than second.
|
|
**Example**: `5 3 > // => true`
|
|
**See Also**: >=, <, <=
|
|
**Section**: 4.3 (Comparison Operators)
|
|
|
|
#### >=
|
|
**Operator Type**: Comparison
|
|
**Signature**: `(Orderable Orderable -- bool)`
|
|
**Trait**: Orderable
|
|
**Description**: True if first value is greater than or equal to second.
|
|
**Example**: `5 5 >= // => true`
|
|
**See Also**: >, <, <=
|
|
**Section**: 4.3 (Comparison Operators)
|
|
|
|
#### ^
|
|
**Operator Type**: Arithmetic
|
|
**Signature**: `(Exponentiable Exponentiable -- Exponentiable)`
|
|
**Trait**: Exponentiable
|
|
**Description**: Raise first value to power of second (exponentiation).
|
|
**Example**: `2 8 ^ // => 256`
|
|
**See Also**: log, ln, sqrt
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### abs
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Return absolute value of number.
|
|
**Example**: `-42 abs // => 42`
|
|
**See Also**: min, max
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### acos
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate arc cosine in radians.
|
|
**Example**: `1.0 acos // => 0.0`
|
|
**See Also**: cos, asin, atan
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### and
|
|
**Operator Type**: Logical
|
|
**Signature**: `(Logical Logical -- Logical)`
|
|
**Trait**: Logical
|
|
**Description**: Logical AND - returns first if falsy, else second.
|
|
**Example**: `true false and // => false`
|
|
**See Also**: or, not
|
|
**Section**: 4.4 (Logical Operators)
|
|
|
|
#### asin
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate arc sine in radians.
|
|
**Example**: `1.0 asin // => ~1.5708`
|
|
**See Also**: sin, acos, atan
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### assert
|
|
**Operator Type**: Testing
|
|
**Signature**: `(TokenString TokenString --)`
|
|
**Description**: Evaluate expression and condition, halt if condition is false.
|
|
**Example**: `{ 2 3 + } { 5 == } assert`
|
|
**See Also**: type_of, implements
|
|
**Section**: 11.3 (Testing and Assertions)
|
|
|
|
#### at
|
|
**Operator Type**: Container Access
|
|
**Signature**: `(Selectable<T> Size -- T)`
|
|
**Trait**: Selectable<T>
|
|
**Description**: Access element at given index.
|
|
**Example**: `[10 20 30] 1 at // => 20`
|
|
**See Also**: slice, length
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### atan
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate arc tangent in radians.
|
|
**Example**: `1.0 atan // => ~0.7854`
|
|
**See Also**: tan, atan2, asin
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### atan2
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Two-argument arc tangent using signs to determine quadrant.
|
|
**Example**: `1.0 1.0 atan2 // => ~0.7854`
|
|
**See Also**: atan, tan
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### bitand
|
|
**Operator Type**: Bitwise
|
|
**Signature**: `(Bitwise Bitwise -- Bitwise)`
|
|
**Trait**: Bitwise
|
|
**Description**: Bitwise AND of two values.
|
|
**Example**: `0xFF 0x0F bitand // => 0x0F`
|
|
**See Also**: bitor, bitxor, bitnot
|
|
**Section**: 4.5 (Bitwise Operators)
|
|
|
|
#### bitnot
|
|
**Operator Type**: Bitwise
|
|
**Signature**: `(Bitwise -- Bitwise)`
|
|
**Trait**: Bitwise
|
|
**Description**: Bitwise NOT (complement) of value.
|
|
**Example**: `0xFF bitnot // => (inverted bits)`
|
|
**See Also**: bitand, bitor, bitxor
|
|
**Section**: 4.5 (Bitwise Operators)
|
|
|
|
#### bitor
|
|
**Operator Type**: Bitwise
|
|
**Signature**: `(Bitwise Bitwise -- Bitwise)`
|
|
**Trait**: Bitwise
|
|
**Description**: Bitwise OR of two values.
|
|
**Example**: `0xF0 0x0F bitor // => 0xFF`
|
|
**See Also**: bitand, bitxor, bitnot
|
|
**Section**: 4.5 (Bitwise Operators)
|
|
|
|
#### bitxor
|
|
**Operator Type**: Bitwise
|
|
**Signature**: `(Bitwise Bitwise -- Bitwise)`
|
|
**Trait**: Bitwise
|
|
**Description**: Bitwise XOR of two values.
|
|
**Example**: `0xFF 0x0F bitxor // => 0xF0`
|
|
**See Also**: bitand, bitor, bitnot
|
|
**Section**: 4.5 (Bitwise Operators)
|
|
|
|
#### break
|
|
**Operator Type**: Control Flow
|
|
**Signature**: `(--)`
|
|
**Description**: Exit the current loop immediately.
|
|
**Example**: `{ true } { condition { break } { } if } while`
|
|
**See Also**: continue, while, for
|
|
**Section**: 6.4 (Loop Control)
|
|
|
|
#### ceil
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Round number up to nearest integer.
|
|
**Example**: `3.14 ceil // => 4.0`
|
|
**See Also**: floor, round
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### concat
|
|
**Operator Type**: Container
|
|
**Signature**: `(Concatenable Concatenable -- Concatenable)`
|
|
**Trait**: Concatenable
|
|
**Description**: Concatenate two containers or strings.
|
|
**Example**: `[1 2 3] [4 5 6] concat // => [1 2 3 4 5 6]`
|
|
**See Also**: slice, reverse
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### continue
|
|
**Operator Type**: Control Flow
|
|
**Signature**: `(--)`
|
|
**Description**: Skip to the next iteration of the current loop.
|
|
**Example**: `1 10 { dup 2 % 0 == { continue } { print } if } for`
|
|
**See Also**: break, while, for
|
|
**Section**: 6.4 (Loop Control)
|
|
|
|
#### cos
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate cosine of angle in radians.
|
|
**Example**: `0.0 cos // => 1.0`
|
|
**See Also**: sin, tan, acos
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### depth
|
|
**Operator Type**: Stack Manipulation
|
|
**Signature**: `(-- Size)`
|
|
**Trait**: Stackable
|
|
**Description**: Push current stack depth onto the stack.
|
|
**Example**: `1 2 3 depth // => 1 2 3 3`
|
|
**See Also**: pick, roll
|
|
**Section**: 4.1 (Stack Operations)
|
|
|
|
#### drop
|
|
**Operator Type**: Stack Manipulation
|
|
**Signature**: `(Self --)`
|
|
**Trait**: Stackable
|
|
**Description**: Remove and discard the top item from the stack.
|
|
**Example**: `5 10 drop // => 5`
|
|
**See Also**: dup, swap
|
|
**Section**: 4.1 (Stack Operations)
|
|
|
|
#### dup
|
|
**Operator Type**: Stack Manipulation
|
|
**Signature**: `(Self -- Self Self)`
|
|
**Trait**: Stackable
|
|
**Description**: Duplicate the top item on the stack.
|
|
**Example**: `5 dup // => 5 5`
|
|
**See Also**: drop, over
|
|
**Section**: 4.1 (Stack Operations)
|
|
|
|
#### each
|
|
**Operator Type**: Array Combinator
|
|
**Signature**: `(ArrayOf<T> TokenString --)`
|
|
**Description**: Apply function to each element (side effects).
|
|
**Example**: `[1 2 3] { print } each`
|
|
**See Also**: map, filter, reduce
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### ends_with
|
|
**Operator Type**: String
|
|
**Signature**: `(String String -- bool)`
|
|
**Trait**: String
|
|
**Description**: Check if string ends with given suffix.
|
|
**Example**: `"hello" "lo" ends_with // => true`
|
|
**See Also**: starts_with, find
|
|
**Section**: 11.5 (String Operations)
|
|
|
|
#### enum
|
|
**Operator Type**: Definition
|
|
**Signature**: `(TokenString Identifier --)`
|
|
**Trait**: Implementable
|
|
**Description**: Define an enumeration type.
|
|
**Example**: `{ Pending: Active: Complete: } ::Status enum`
|
|
**See Also**: struct, union, trait
|
|
**Section**: 7.3 (Enums)
|
|
|
|
#### enumerate
|
|
**Operator Type**: Array
|
|
**Signature**: `(ArrayOf<T> -- ArrayOf<Pair<Size T>>)`
|
|
**Description**: Add indices to array elements.
|
|
**Example**: `["a" "b" "c"] enumerate // => [[0 "a"] [1 "b"] [2 "c"]]`
|
|
**See Also**: zip, map
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### eval
|
|
**Operator Type**: Meta
|
|
**Signature**: `(TokenString --)`
|
|
**Trait**: Implementable
|
|
**Description**: Parse and execute TokenString as code.
|
|
**Example**: `"2 3 +" eval // => 5`
|
|
**See Also**: lambda
|
|
**Section**: 11.1 (Dynamic Code Evaluation)
|
|
|
|
#### filter
|
|
**Operator Type**: Array Combinator
|
|
**Signature**: `(ArrayOf<T> TokenString -- ArrayOf<T>)`
|
|
**Description**: Keep only elements matching predicate.
|
|
**Example**: `[1 2 3 4 5] { 2 % 0 == } filter // => [2 4]`
|
|
**See Also**: map, reduce, each
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### find
|
|
**Operator Type**: String
|
|
**Signature**: `(String String -- Option<Size>)`
|
|
**Trait**: String
|
|
**Description**: Find position of substring.
|
|
**Example**: `"hello world" "world" find // => Option::Some(6)`
|
|
**See Also**: starts_with, ends_with
|
|
**Section**: 11.5 (String Operations)
|
|
|
|
#### floor
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Round number down to nearest integer.
|
|
**Example**: `3.14 floor // => 3.0`
|
|
**See Also**: ceil, round
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### fn
|
|
**Operator Type**: Definition
|
|
**Signature**: `(TypeTuple TokenString Identifier --)`
|
|
**Trait**: Implementable
|
|
**Description**: Define a function.
|
|
**Example**: `(Number -- Number) { dup * } ::square fn`
|
|
**See Also**: lambda, trait, impl
|
|
**Section**: 5.2 (Defining Functions)
|
|
|
|
#### foldl
|
|
**Operator Type**: Array Combinator
|
|
**Signature**: `(ArrayOf<T> U TokenString -- U)`
|
|
**Description**: Left fold array with accumulator function.
|
|
**Example**: `[1 2 3 4] 0 { + } foldl // => 10`
|
|
**See Also**: foldr, reduce
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### foldr
|
|
**Operator Type**: Array Combinator
|
|
**Signature**: `(ArrayOf<T> U TokenString -- U)`
|
|
**Description**: Right fold array with accumulator function.
|
|
**Example**: `[1 2 3 4] 0 { + } foldr // => 10`
|
|
**See Also**: foldl, reduce
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### for
|
|
**Operator Type**: Control Flow
|
|
**Signature**: `(Size Size TokenString --)`
|
|
**Description**: Loop from start to end, pushing counter each iteration.
|
|
**Example**: `1 10 { dup print } for`
|
|
**See Also**: while, break, continue
|
|
**Section**: 6.3 (For Loops)
|
|
|
|
#### format
|
|
**Operator Type**: String
|
|
**Signature**: `(String Iterable<Stringifiable> -- String)`
|
|
**Trait**: String
|
|
**Description**: Format string with values, replacing placeholders.
|
|
**Example**: `"x=%d, y=%d" [5 10] format // => "x=5, y=10"`
|
|
**See Also**: to_str, concat
|
|
**Section**: 11.5 (String Operations)
|
|
|
|
#### get
|
|
**Operator Type**: Struct Access
|
|
**Signature**: `(Struct Identifier -- FieldValue)`
|
|
**Description**: Get field value from struct (consumes struct and field identifier).
|
|
**Example**: `point ::x get`
|
|
**See Also**: set
|
|
**Section**: 7.1 (Structs)
|
|
|
|
#### if
|
|
**Operator Type**: Control Flow
|
|
**Signature**: `(bool TokenString TokenString --)`
|
|
**Description**: Conditional execution - execute first block if true, second if false.
|
|
**Example**: `x 0 > { "positive" print } { "negative" print } if`
|
|
**See Also**: match, while
|
|
**Section**: 6.1 (Conditionals)
|
|
|
|
#### impl
|
|
**Operator Type**: Definition
|
|
**Signature**: `(Identifier TokenString Identifier --)`
|
|
**Trait**: Implementable
|
|
**Description**: Implement a trait for a type.
|
|
**Example**: `::Addable { ... } ::Point impl`
|
|
**See Also**: trait, inher
|
|
**Section**: 9.3 (Implementing Traits)
|
|
|
|
#### implements
|
|
**Operator Type**: Reflection
|
|
**Signature**: `(Self Identifier -- bool)`
|
|
**Description**: Check if value's type implements a specific trait.
|
|
**Example**: `42 ::Addable implements // => true`
|
|
**See Also**: type_of, assert
|
|
**Section**: 11.4 (Reflection)
|
|
|
|
#### inher
|
|
**Operator Type**: Definition
|
|
**Signature**: `(ArrayOf<Identifier> Identifier --)`
|
|
**Trait**: Implementable
|
|
**Description**: Declare trait inheritance.
|
|
**Example**: `[ ::Orderable ::Equatable ] ::Comparable inher`
|
|
**See Also**: trait, impl
|
|
**Section**: 9.4 (Trait Inheritance)
|
|
|
|
#### lambda
|
|
**Operator Type**: Meta
|
|
**Signature**: `(TokenString -- Callable)`
|
|
**Trait**: Implementable
|
|
**Description**: Convert TokenString to callable code block.
|
|
**Example**: `{ dup * } lambda ::square swap`
|
|
**See Also**: eval, fn
|
|
**Section**: 5.6 (Lambda Functions)
|
|
|
|
#### length
|
|
**Operator Type**: Container
|
|
**Signature**: `(Sized -- i64)`
|
|
**Trait**: Sized
|
|
**Description**: Get the number of elements in a container.
|
|
**Example**: `[1 2 3 4 5] length // => 5`
|
|
**See Also**: at, slice
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### ln
|
|
**Operator Type**: Arithmetic
|
|
**Signature**: `(Logarithmic -- Logarithmic)`
|
|
**Trait**: Logarithmic
|
|
**Description**: Natural logarithm (base e).
|
|
**Example**: `2.718 ln // => 1.0`
|
|
**See Also**: log, logb, ^
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### log
|
|
**Operator Type**: Arithmetic
|
|
**Signature**: `(Logarithmic -- Logarithmic)`
|
|
**Trait**: Logarithmic
|
|
**Description**: Logarithm base 10.
|
|
**Example**: `100 log // => 2.0`
|
|
**See Also**: ln, logb, ^
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### logb
|
|
**Operator Type**: Arithmetic
|
|
**Signature**: `(Logarithmic Logarithmic -- Logarithmic)`
|
|
**Trait**: Logarithmic
|
|
**Description**: Logarithm with custom base.
|
|
**Example**: `8 2 logb // => 3.0`
|
|
**See Also**: log, ln, ^
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### map
|
|
**Operator Type**: Array Combinator
|
|
**Signature**: `(ArrayOf<T> TokenString -- ArrayOf<U>)`
|
|
**Description**: Transform each element with function.
|
|
**Example**: `[1 2 3 4] { 2 * } map // => [2 4 6 8]`
|
|
**See Also**: filter, reduce, each
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### match
|
|
**Operator Type**: Control Flow
|
|
**Signature**: `(Value TokenString --)`
|
|
**Description**: Pattern match value against multiple patterns.
|
|
**Example**: `opt { Some(x) => { x print } None => { "Nothing" print } } match`
|
|
**See Also**: if
|
|
**Section**: 6.5 (Pattern Matching)
|
|
|
|
#### max
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Return the maximum of two values.
|
|
**Example**: `3 5 max // => 5`
|
|
**See Also**: min, abs
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### mean
|
|
**Operator Type**: Array
|
|
**Signature**: `(ArrayOf<Number> -- f64)`
|
|
**Description**: Calculate average of numeric array elements.
|
|
**Example**: `[1 2 3 4 5] mean // => 3.0`
|
|
**See Also**: sum, reduce
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### min
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Return the minimum of two values.
|
|
**Example**: `3 5 min // => 3`
|
|
**See Also**: max, abs
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### not
|
|
**Operator Type**: Logical
|
|
**Signature**: `(Logical -- Logical)`
|
|
**Trait**: Logical
|
|
**Description**: Logical NOT - inverts truthiness.
|
|
**Example**: `false not // => true`
|
|
**See Also**: and, or
|
|
**Section**: 4.4 (Logical Operators)
|
|
|
|
#### or
|
|
**Operator Type**: Logical
|
|
**Signature**: `(Logical Logical -- Logical)`
|
|
**Trait**: Logical
|
|
**Description**: Logical OR - returns first if truthy, else second.
|
|
**Example**: `true false or // => true`
|
|
**See Also**: and, not
|
|
**Section**: 4.4 (Logical Operators)
|
|
|
|
#### over
|
|
**Operator Type**: Stack Manipulation
|
|
**Signature**: `(Self Self -- Self Self Self)`
|
|
**Trait**: Stackable
|
|
**Description**: Copy the second item to the top of the stack.
|
|
**Example**: `5 10 over // => 5 10 5`
|
|
**See Also**: dup, swap, rot
|
|
**Section**: 4.1 (Stack Operations)
|
|
|
|
#### pick
|
|
**Operator Type**: Stack Manipulation
|
|
**Signature**: `(Size -- Self)`
|
|
**Trait**: Stackable
|
|
**Description**: Copy nth item to top (0 = top, 1 = second, etc.).
|
|
**Example**: `1 2 3 4 2 pick // => 1 2 3 4 2`
|
|
**See Also**: roll, depth
|
|
**Section**: 4.1 (Stack Operations)
|
|
|
|
#### rand
|
|
**Operator Type**: Randomness
|
|
**Signature**: `(-- f64)`
|
|
**Description**: Generate random f64 in range [0.0, 1.0).
|
|
**Example**: `rand // => 0.7234...`
|
|
**See Also**: seed
|
|
**Section**: 4.6 (Randomness)
|
|
|
|
#### reduce
|
|
**Operator Type**: Array Combinator
|
|
**Signature**: `(ArrayOf<T> T TokenString -- T)`
|
|
**Description**: Fold array with accumulator function.
|
|
**Example**: `[1 2 3 4] 0 { + } reduce // => 10`
|
|
**See Also**: map, filter, foldl
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### replace
|
|
**Operator Type**: String
|
|
**Signature**: `(String String String -- String)`
|
|
**Trait**: String
|
|
**Description**: Replace all occurrences of substring with replacement.
|
|
**Example**: `"hello world" "world" "Stack" replace // => "hello Stack"`
|
|
**See Also**: split, concat
|
|
**Section**: 11.5 (String Operations)
|
|
|
|
#### reverse
|
|
**Operator Type**: Array
|
|
**Signature**: `(ArrayOf<T> -- ArrayOf<T>)`
|
|
**Description**: Reverse order of array elements.
|
|
**Example**: `[1 2 3] reverse // => [3 2 1]`
|
|
**See Also**: transpose, concat
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### roll
|
|
**Operator Type**: Stack Manipulation
|
|
**Signature**: `(Size Size --)`
|
|
**Trait**: Stackable
|
|
**Description**: Rotate n items, times times.
|
|
**Example**: `1 2 3 4 3 1 roll // => 1 3 4 2`
|
|
**See Also**: rot, pick
|
|
**Section**: 4.1 (Stack Operations)
|
|
|
|
#### rot
|
|
**Operator Type**: Stack Manipulation
|
|
**Signature**: `(Self Self Self -- Self Self Self)`
|
|
**Trait**: Stackable
|
|
**Description**: Rotate the top three items.
|
|
**Example**: `1 2 3 rot // => 2 3 1`
|
|
**See Also**: swap, roll
|
|
**Section**: 4.1 (Stack Operations)
|
|
|
|
#### round
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Round number to nearest integer.
|
|
**Example**: `3.7 round // => 4.0`
|
|
**See Also**: floor, ceil
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### seed
|
|
**Operator Type**: Randomness
|
|
**Signature**: `(u64 --)`
|
|
**Description**: Seed the random number generator with specific value.
|
|
**Example**: `12345 seed`
|
|
**See Also**: rand
|
|
**Section**: 4.6 (Randomness)
|
|
|
|
#### set
|
|
**Operator Type**: Struct Access
|
|
**Signature**: `(Value Identifier -- Struct)`
|
|
**Description**: Set field value in struct (consumes value and field identifier).
|
|
**Example**: `15.0 ::x set`
|
|
**See Also**: get
|
|
**Section**: 7.1 (Structs)
|
|
|
|
#### shl
|
|
**Operator Type**: Bitwise
|
|
**Signature**: `(Bitwise Size -- Bitwise)`
|
|
**Trait**: Bitwise
|
|
**Description**: Shift bits left by n positions.
|
|
**Example**: `4 2 shl // => 16`
|
|
**See Also**: shr, bitand, bitor
|
|
**Section**: 4.5 (Bitwise Operators)
|
|
|
|
#### shr
|
|
**Operator Type**: Bitwise
|
|
**Signature**: `(Bitwise Size -- Bitwise)`
|
|
**Trait**: Bitwise
|
|
**Description**: Shift bits right by n positions.
|
|
**Example**: `16 2 shr // => 4`
|
|
**See Also**: shl, bitand, bitor
|
|
**Section**: 4.5 (Bitwise Operators)
|
|
|
|
#### sin
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate sine of angle in radians.
|
|
**Example**: `0.0 sin // => 0.0`
|
|
**See Also**: cos, tan, asin
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### slice
|
|
**Operator Type**: Container
|
|
**Signature**: `(Sliceable Size Size -- Sliceable)`
|
|
**Trait**: Sliceable
|
|
**Description**: Extract elements from start to end index.
|
|
**Example**: `[10 20 30 40] 1 3 slice // => [20 30]`
|
|
**See Also**: at, length
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### split
|
|
**Operator Type**: String
|
|
**Signature**: `(String String -- ArrayOf<String>)`
|
|
**Trait**: String
|
|
**Description**: Split string by delimiter.
|
|
**Example**: `"a,b,c" "," split // => ["a" "b" "c"]`
|
|
**See Also**: join, substr
|
|
**Section**: 11.5 (String Operations)
|
|
|
|
#### sqrt
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate square root.
|
|
**Example**: `16 sqrt // => 4.0`
|
|
**See Also**: ^
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### starts_with
|
|
**Operator Type**: String
|
|
**Signature**: `(String String -- bool)`
|
|
**Trait**: String
|
|
**Description**: Check if string starts with given prefix.
|
|
**Example**: `"hello" "hel" starts_with // => true`
|
|
**See Also**: ends_with, find
|
|
**Section**: 11.5 (String Operations)
|
|
|
|
#### struct
|
|
**Operator Type**: Definition
|
|
**Signature**: `(TypeTuple TokenString Identifier --)`
|
|
**Trait**: Implementable
|
|
**Description**: Define a struct type.
|
|
**Example**: `(T T --) { x: y: } ::Point<T> struct`
|
|
**See Also**: union, enum, get, set
|
|
**Section**: 7.1 (Structs)
|
|
|
|
#### substr
|
|
**Operator Type**: String
|
|
**Signature**: `(String Size Size -- String)`
|
|
**Trait**: String
|
|
**Description**: Extract substring from start to end index.
|
|
**Example**: `"hello" 1 3 substr // => "el"`
|
|
**See Also**: slice, split
|
|
**Section**: 11.5 (String Operations)
|
|
|
|
#### sum
|
|
**Operator Type**: Array
|
|
**Signature**: `(ArrayOf<Number> -- Number)`
|
|
**Description**: Sum all numeric elements in array.
|
|
**Example**: `[1 2 3 4 5] sum // => 15`
|
|
**See Also**: mean, reduce
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### swap
|
|
**Operator Type**: Stack Manipulation
|
|
**Signature**: `(Self Self -- Self Self)`
|
|
**Trait**: Stackable
|
|
**Description**: Swap the top two items on the stack.
|
|
**Example**: `5 10 swap // => 10 5`
|
|
**See Also**: dup, rot
|
|
**Section**: 4.1 (Stack Operations)
|
|
|
|
#### tan
|
|
**Operator Type**: Mathematical
|
|
**Signature**: `(Math -- Math)`
|
|
**Trait**: Math
|
|
**Description**: Calculate tangent of angle in radians.
|
|
**Example**: `0.0 tan // => 0.0`
|
|
**See Also**: sin, cos, atan
|
|
**Section**: 4.2 (Arithmetic Operators)
|
|
|
|
#### trait
|
|
**Operator Type**: Definition
|
|
**Signature**: `(TokenString Identifier --)`
|
|
**Trait**: Implementable
|
|
**Description**: Define a new trait.
|
|
**Example**: `{ (Self -- ) draw: } ::Drawable trait`
|
|
**See Also**: impl, inher
|
|
**Section**: 9.2 (Defining Traits)
|
|
|
|
#### transpose
|
|
**Operator Type**: Array
|
|
**Signature**: `(ArrayOf<ArrayOf<T>> -- ArrayOf<ArrayOf<T>>)`
|
|
**Description**: Transpose a 2D array (swap rows and columns).
|
|
**Example**: `[[1 2] [3 4]] transpose // => [[1 3] [2 4]]`
|
|
**See Also**: reverse
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### trim
|
|
**Operator Type**: String
|
|
**Signature**: `(String -- String)`
|
|
**Trait**: String
|
|
**Description**: Remove leading and trailing whitespace.
|
|
**Example**: `" hello " trim // => "hello"`
|
|
**See Also**: split, replace
|
|
**Section**: 11.5 (String Operations)
|
|
|
|
#### type_of
|
|
**Operator Type**: Reflection
|
|
**Signature**: `(Self -- Identifier)`
|
|
**Description**: Return the type of a value as an identifier literal.
|
|
**Example**: `42 type_of // => ::i64`
|
|
**See Also**: implements, assert
|
|
**Section**: 11.4 (Reflection)
|
|
|
|
#### union
|
|
**Operator Type**: Definition
|
|
**Signature**: `(TypeTuple TokenString Identifier --)`
|
|
**Trait**: Implementable
|
|
**Description**: Define a union type with tagged variants.
|
|
**Example**: `(T --) { Some(T) None } ::Option<T> union`
|
|
**See Also**: struct, enum, match
|
|
**Section**: 7.2 (Unions)
|
|
|
|
#### while
|
|
**Operator Type**: Control Flow
|
|
**Signature**: `(TokenString TokenString --)`
|
|
**Description**: Loop while condition is truthy, executing body each iteration.
|
|
**Example**: `{ dup 10 < } { dup print 1 + } while`
|
|
**See Also**: for, break, continue, if
|
|
**Section**: 6.2 (While Loops)
|
|
|
|
#### window
|
|
**Operator Type**: Array
|
|
**Signature**: `(ArrayOf<T> Size -- ArrayOf<ArrayOf<T>>)`
|
|
**Description**: Create sliding windows of given size.
|
|
**Example**: `[1 2 3 4] 2 window // => [[1 2] [2 3] [3 4]]`
|
|
**See Also**: slice
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
#### zip
|
|
**Operator Type**: Array
|
|
**Signature**: `(ArrayOf<T> ArrayOf<U> -- ArrayOf<Pair<T U>>)`
|
|
**Description**: Combine two arrays element-wise into pairs.
|
|
**Example**: `[1 2 3] [4 5 6] zip // => [[1 4] [2 5] [3 6]]`
|
|
**See Also**: enumerate, map
|
|
**Section**: 7.4 (Arrays)
|
|
|
|
---
|
|
|
|
## Appendix D: Grammar Summary
|
|
|
|
This appendix provides a concise grammar reference. For complete specifications of language constructs (fn, struct, trait, impl, etc.), see the `::Implementable` trait in Appendix B.
|
|
|
|
### D.1 Lexical Grammar
|
|
|
|
**Comments and Directives**:
|
|
```
|
|
line_comment ::= "//" <any characters until newline>
|
|
directive ::= "#" <implementation-specific>
|
|
shebang ::= "#!/" <path to interpreter>
|
|
```
|
|
|
|
**Identifiers**:
|
|
```
|
|
identifier ::= [a-zA-Z_][a-zA-Z0-9_]*
|
|
identifier_literal ::= "::" identifier
|
|
```
|
|
|
|
**Integer Literals**:
|
|
```
|
|
integer ::= decimal | hexadecimal | binary | octal
|
|
decimal ::= [0-9](_?[0-9])* (":" type_name)?
|
|
hexadecimal ::= "0x" [0-9a-fA-F](_?[0-9a-fA-F])*
|
|
binary ::= "0b" [01](_?[01])*
|
|
octal ::= "0o" [0-7](_?[0-7])*
|
|
```
|
|
|
|
**Floating Point Literals**:
|
|
```
|
|
float ::= [0-9](_?[0-9])* "." [0-9](_?[0-9])* (":" type_name)?
|
|
```
|
|
|
|
**Character Literals**:
|
|
```
|
|
char ::= "'" (character | escape_sequence) "'"
|
|
```
|
|
|
|
**String Literals**:
|
|
```
|
|
string ::= '"' (character | escape_sequence)* '"'
|
|
escape_sequence ::= "\n" | "\r" | "\t" | "\\" | '\"' | "\'" | "\0"
|
|
| "\x" hex_digit hex_digit
|
|
| "\u{" hex_digit+ "}"
|
|
```
|
|
|
|
**Boolean Literals**:
|
|
```
|
|
boolean ::= "true" | "false"
|
|
```
|
|
|
|
**Array Literals**:
|
|
```
|
|
array ::= "[" (expression)* (":"|type_annotation)? "]"
|
|
typed_array ::= "[" (expression)* ":" type_name "]"
|
|
```
|
|
|
|
**Constants**:
|
|
```
|
|
constant ::= literal "::" identifier "const"
|
|
```
|
|
|
|
**Token Strings**:
|
|
```
|
|
token_string ::= "{" (token)* "}"
|
|
```
|
|
|
|
### D.2 Expression Grammar
|
|
|
|
```
|
|
expression ::= literal
|
|
| identifier
|
|
| identifier_literal
|
|
| expression operator
|
|
| control_flow
|
|
| definition
|
|
|
|
literal ::= integer | float | string | boolean | char | array
|
|
|
|
operator ::= built_in_operator | user_defined_operator
|
|
|
|
control_flow ::= if_expr | while_expr | for_expr | match_expr
|
|
```
|
|
|
|
**Note on Operator Precedence**: Stack-based postfix notation eliminates the need for operator precedence. Operations are performed in the order they appear, operating on values already on the stack.
|
|
|
|
### D.3 Type Grammar
|
|
|
|
**Type Tuples (Stack Signatures)**:
|
|
```
|
|
type_tuple ::= "(" type_list "--" type_list ")"
|
|
| "(---)"
|
|
type_list ::= (type)*
|
|
type ::= identifier
|
|
| generic_type
|
|
| trait_constraint
|
|
|
|
generic_type ::= identifier "<" type_param_list ">"
|
|
type_param_list ::= type_param ("," type_param)*
|
|
type_param ::= identifier (":" trait_constraint)?
|
|
```
|
|
|
|
### D.4 Construct Grammar
|
|
|
|
Language constructs (fn, struct, trait, impl, enum, union, inher) are defined by operators in the `::Implementable` trait. These operators parse TokenStrings to create language-level definitions.
|
|
|
|
**High-Level Patterns**:
|
|
- Constants: `value ::name const`
|
|
- Functions: `(inputs -- outputs) { body } ::name fn`
|
|
- Structs: `(field_types --) { field_names: } ::name<type_params>? struct`
|
|
- Unions: `(variant_types --) { Variant(T) ... } ::name<type_params>? union`
|
|
- Enums: `{ Variant value?: ... } ::name enum`
|
|
- Traits: `{ (sig) method: ... } ::identifier<type_params>? trait`
|
|
- Trait Impl: `::trait_id { (sig) { body } method: ... } ::type_id<type_params>? impl`
|
|
- Trait Inheritance: `[ identifier_list ] ::identifier<type_params>? inher { } ::identifier<type_params>? trait`
|
|
|
|
> **Complete Specification**: See Appendix B (`::Implementable` trait) for precise definitions of these construct operators.
|
|
|
|
---
|
|
|
|
## Appendix E: Module System (Future)
|
|
|
|
**Current State**: All standard library functions and traits are automatically in scope.
|
|
|
|
**Future Design**: A module system for organizing code and managing namespaces.
|
|
|
|
**Proposed Syntax**:
|
|
```
|
|
// Import entire module (using :: prefix)
|
|
::std::math use
|
|
|
|
// Import specific items
|
|
::std::collections::HashMap use
|
|
|
|
// Import with alias - Option 1: Inline alias
|
|
::std::io::File ::F as use
|
|
|
|
// Import with alias - Option 2: Separate alias operator
|
|
::std::io::File ::F use_as
|
|
|
|
// Import with alias - Option 3: Block syntax
|
|
{ ::std::io::File ::F as } use
|
|
|
|
// Export from current module
|
|
::Point ::geometry export
|
|
::distance ::geometry export
|
|
|
|
// Module declaration
|
|
::my_module module {
|
|
// Module contents
|
|
}
|
|
```
|
|
|
|
**Module Resolution**:
|
|
- Standard library: `::std::<module>::<item>`
|
|
- User modules: Relative to current file
|
|
- Third-party: Package manager integration (future)
|
|
|
|
**Benefits**:
|
|
- Clean namespaces
|
|
- Explicit dependencies
|
|
- Code organization
|
|
- Faster compilation (selective imports)
|
|
|
|
---
|
|
|
|
## Appendix F: Memory Management (Future)
|
|
|
|
The language specification currently does not include heap memory management. This appendix documents potential future approaches.
|
|
|
|
**Current State**: All values are stack-allocated or embedded in data structures.
|
|
|
|
**Pointer Types**: The `ptr` type for raw pointers is planned as a future feature and will be part of the memory management system.
|
|
|
|
**Potential Approaches**:
|
|
|
|
**Option A: Manual Management**
|
|
```
|
|
// Allocate on heap
|
|
3.0 4.0 Point alloc // ( Point -- ptr<Point> )
|
|
|
|
// Dereference
|
|
ptr deref // ( ptr<T> -- T )
|
|
|
|
// Store through pointer
|
|
new_value ptr store // ( T ptr<T> -- )
|
|
|
|
// Free memory
|
|
ptr free // ( ptr<T> -- )
|
|
```
|
|
|
|
Pros: Full control, predictable, zero overhead
|
|
Cons: Error-prone, requires discipline, potential memory leaks
|
|
|
|
**Option B: Reference Counting**
|
|
```
|
|
// Create reference-counted value
|
|
3.0 4.0 Point rc // ( Point -- rc<Point> )
|
|
|
|
// Automatic reference counting
|
|
value dup // Increments count
|
|
drop // Decrements count, frees if zero
|
|
```
|
|
|
|
Pros: Automatic cleanup, relatively simple
|
|
Cons: Runtime overhead, cannot handle cycles, larger memory footprint
|
|
|
|
**Option C: Ownership System (Rust-like)**
|
|
```
|
|
// Linear types - each value has one owner
|
|
value // Move semantics by default
|
|
value dup // Error: cannot copy owned value
|
|
value ::clone call // Explicit clone required
|
|
```
|
|
|
|
Pros: Memory safe, zero overhead, prevents leaks
|
|
Cons: Complex type system, restricts stack operations, steep learning curve
|
|
|
|
**Option D: Arena/Region-Based**
|
|
```
|
|
// Create arena
|
|
::arena new // ( -- arena )
|
|
|
|
// Allocate in arena
|
|
arena 3.0 4.0 Point alloc_in // ( arena Point -- ptr<Point> )
|
|
|
|
// Free entire arena
|
|
arena free_arena // ( arena -- )
|
|
```
|
|
|
|
Pros: Fast allocation, simple bulk deallocation
|
|
Cons: Less granular control, memory held until arena freed
|
|
|
|
**Recommendation**: Start without heap allocation (current approach). When needed, implement Option A (manual) for simplicity, with Option D (arenas) added later for performance-critical code. The stack-based nature makes ownership tracking (Option C) particularly challenging.
|
|
|
|
**Type Parameter Enforcement Enhancement**:
|
|
|
|
**Current State**: Type parameters in generic functions are currently suggestions and are not enforced at parse time.
|
|
|
|
**Example**:
|
|
```
|
|
(T -- T) { dup * } ::square fn // Currently no error even without Multiplyable constraint
|
|
```
|
|
|
|
**Future Enhancement**: The compiler could enforce that type parameters actually constrain how operators and functions act, validated at parse time:
|
|
```
|
|
(Multiplyable -- Multiplyable) { dup * } ::square fn // Enforced constraint
|
|
```
|
|
|
|
This would provide stronger type safety but add complexity to the type checker.
|
|
|
|
**Testing Framework (Future)**:
|
|
|
|
**Current State**: Basic `assert` operator is available for inline testing.
|
|
|
|
**Future Design**: A comprehensive testing framework with dedicated operators.
|
|
|
|
**Proposed Operators**:
|
|
```
|
|
// Define a test
|
|
{ { 2 3 + } { 5 == } assert } "addition test" test
|
|
|
|
// Test for expected errors
|
|
{ 1 0 / } "division by zero test" test_error
|
|
|
|
// Test suites
|
|
{
|
|
{ 2 3 + 5 == } "addition" test
|
|
{ 5 2 - 3 == } "subtraction" test
|
|
} "arithmetic tests" test_suite
|
|
```
|
|
|
|
**Features**:
|
|
- Named tests for better reporting
|
|
- Expected error testing
|
|
- Test suites for organization
|
|
- Setup/teardown hooks
|
|
- Test discovery and running
|
|
|
|
**Documentation Comments (Future)**:
|
|
|
|
**Proposed Syntax**:
|
|
```
|
|
/// Calculates the square of a number.
|
|
/// Takes a number and returns its square.
|
|
(Number -- Number) { dup * } ::square fn
|
|
|
|
/// A point in 2D space.
|
|
/// Fields:
|
|
/// x: The x-coordinate
|
|
/// y: The y-coordinate
|
|
(T T --) { x: y: } ::Point<T> struct
|
|
```
|
|
|
|
**Features**:
|
|
- Extract documentation from source
|
|
- Generate HTML/markdown documentation
|
|
- Support for examples and tests in docs
|
|
- Cross-referencing between definitions
|
|
|
|
**Advanced Compiler Directives (Future)**:
|
|
|
|
Beyond the basic shebang, future versions may support:
|
|
|
|
```
|
|
#require "0.9.0" // Minimum language version
|
|
#optimize speed // Optimization hints
|
|
#allow unsafe // Enable unsafe operations
|
|
#deprecated "Use new_fn" // Deprecation warnings
|
|
```
|
|
|
|
---
|
|
|
|
## Appendix G: Examples & Tutorials
|
|
|
|
### G.1 Tutorial: First Steps
|
|
|
|
**Hello World**:
|
|
```
|
|
"Hello, World!" print
|
|
```
|
|
|
|
**Basic Arithmetic**:
|
|
```
|
|
// Simple calculations
|
|
3 4 + // => 7
|
|
10 3 - // => 7
|
|
5 6 * // => 30
|
|
20 4 / // => 5
|
|
|
|
// Chaining operations
|
|
2 3 + 4 * // => 20 (addition happens first due to postfix order)
|
|
|
|
// Using the stack
|
|
10 dup * // => 100 (duplicate 10, then multiply)
|
|
```
|
|
|
|
**Simple Functions**:
|
|
```
|
|
// Square function
|
|
(Number -- Number) { dup * } ::square fn
|
|
5 square // => 25
|
|
|
|
// Absolute value
|
|
(Number -- Number) {
|
|
dup 0 >
|
|
{ } // If positive, do nothing
|
|
{ 0 swap - } // If negative, negate
|
|
if
|
|
} ::abs fn
|
|
|
|
-5 abs // => 5
|
|
```
|
|
|
|
**Stack Manipulation Practice**:
|
|
```
|
|
// Basic stack operations
|
|
5 dup // => 5 5
|
|
5 10 swap // => 10 5
|
|
5 10 over // => 5 10 5
|
|
1 2 3 rot // => 2 3 1
|
|
|
|
// More complex example - swap two items below top
|
|
// Stack: a b c
|
|
// Want: b a c
|
|
rot rot // First rot: b c a, Second rot: c a b... wait, that's wrong!
|
|
|
|
// Better approach:
|
|
// Stack: a b c
|
|
swap rot rot // swap: a c b, rot: c b a, rot: b a c (correct!)
|
|
```
|
|
|
|
### G.2 Tutorial: Working with Traits
|
|
|
|
**Implementing a Trait for a Custom Type**:
|
|
|
|
```
|
|
// Step 1: Define a struct
|
|
(Number Number --) { x: y: } ::Point struct
|
|
|
|
// Step 2: Implement Addable trait
|
|
::Addable {
|
|
// Add two points
|
|
(Self Self -- Self) {
|
|
over ::x get over ::x get + // Add x coordinates
|
|
swap ::y get swap ::y get + // Add y coordinates
|
|
Point // Construct new point
|
|
} +:
|
|
|
|
// Subtract two points
|
|
(Self Self -- Self) {
|
|
over ::x get over ::x get - // Subtract x coordinates
|
|
swap ::y get swap ::y get - // Subtract y coordinates
|
|
Point // Construct new point
|
|
} -:
|
|
} ::Point impl
|
|
|
|
// Step 3: Use it
|
|
3.0 4.0 Point // First point
|
|
1.0 2.0 Point // Second point
|
|
+ // => Point with x=4.0, y=6.0
|
|
```
|
|
|
|
**Using Trait Bounds**:
|
|
|
|
```
|
|
// Function that works with any Addable type
|
|
(Addable Addable Addable -- Addable) {
|
|
+ + // Add all three
|
|
} ::sum_three fn
|
|
|
|
// Works with numbers
|
|
1 2 3 sum_three // => 6
|
|
|
|
// Works with Points
|
|
1.0 2.0 Point
|
|
3.0 4.0 Point
|
|
5.0 6.0 Point
|
|
sum_three // => Point(9.0, 12.0)
|
|
```
|
|
|
|
**Understanding Standard Traits**:
|
|
|
|
```
|
|
// Number trait combines many operations
|
|
(Number Number -- Number) {
|
|
dup * swap dup * + // a² + b²
|
|
} ::pythagorean fn
|
|
|
|
3.0 4.0 pythagorean // => 25.0
|
|
|
|
// This works because Number inherits from:
|
|
// - Addable (for +)
|
|
// - Multiplyable (for *)
|
|
// - Comparable (for comparisons)
|
|
// - And more...
|
|
```
|
|
|
|
### G.3 Tutorial: Generic Programming
|
|
|
|
**Writing Generic Functions**:
|
|
|
|
```
|
|
// Generic identity - works with any type
|
|
(T -- T) { } ::identity fn
|
|
|
|
5 identity // => 5
|
|
"hello" identity // => "hello"
|
|
|
|
// Generic swap function
|
|
(T U -- U T) { swap } ::generic_swap fn
|
|
|
|
// Constrained generic - requires Comparable
|
|
(Comparable Comparable -- Comparable) {
|
|
over over >
|
|
{ } // First is larger, do nothing
|
|
{ swap } // Second is larger, swap them
|
|
if
|
|
drop // Drop the smaller value
|
|
} ::max fn
|
|
|
|
5 10 max // => 10
|
|
10 5 max // => 10
|
|
```
|
|
|
|
**Generic Data Structures**:
|
|
|
|
```
|
|
// Define a generic Pair
|
|
(T U --) { first: second: } ::Pair<T U> struct
|
|
|
|
// Use with different types
|
|
5 "hello" Pair // Pair<i64, String>
|
|
3.14 true Pair // Pair<f64, bool>
|
|
|
|
// Access fields
|
|
dup ::first get // Get first element
|
|
::second get // Get second element
|
|
|
|
// Generic Option (already defined in standard library)
|
|
(T --) { Some(T) None } ::Option<T> union
|
|
|
|
42 Option::Some // Option<i64>::Some
|
|
Option::None // Option<T>::None
|
|
```
|
|
|
|
**Trait Constraints in Generics**:
|
|
|
|
```
|
|
// This function requires the type to be Multiplyable
|
|
(T:Multiplyable -- T) {
|
|
dup *
|
|
} ::square_generic fn
|
|
|
|
// Works with any Multiplyable type
|
|
5 square_generic // => 25
|
|
3.14 square_generic // => 9.8596
|
|
|
|
// Multiple constraints using composite traits
|
|
(Number -- Number) {
|
|
dup 0 >
|
|
{ }
|
|
{ 0 swap - }
|
|
if
|
|
} ::abs_generic fn
|
|
```
|
|
|
|
### G.4 Complete Examples
|
|
|
|
#### G.4.1 Trait Implementation Example
|
|
|
|
```
|
|
// Define a trait for drawable objects
|
|
{
|
|
(Self -- ) draw:
|
|
} ::Drawable trait
|
|
|
|
// Define a Rectangle struct
|
|
(Number Number --) { width: height: } ::Rectangle struct
|
|
|
|
// Implement Drawable for Rectangle
|
|
::Drawable {
|
|
(Self -- ) {
|
|
"Drawing rectangle:" print
|
|
dup ::width get "Width: " swap concat print
|
|
::height get "Height: " swap concat print
|
|
} draw:
|
|
} ::Rectangle impl
|
|
|
|
// Use it
|
|
10.0 20.0 Rectangle draw
|
|
// Output:
|
|
// Drawing rectangle:
|
|
// Width: 10.0
|
|
// Height: 20.0
|
|
```
|
|
|
|
#### G.4.2 Trait Inheritance Example
|
|
|
|
```
|
|
// Define base traits
|
|
{
|
|
(Self Self -- Self) +:
|
|
(Self Self -- Self) -:
|
|
} ::Addable trait
|
|
|
|
{
|
|
(Self Self -- Self) *:
|
|
(Self Self -- Self) /:
|
|
} ::Multiplyable trait
|
|
|
|
// Composite trait inheriting from both
|
|
[ ::Addable ::Multiplyable ] ::BasicMath inher
|
|
{ } ::BasicMath trait
|
|
|
|
// Now any type implementing BasicMath must support +, -, *, /
|
|
// And functions can require BasicMath as a constraint
|
|
(BasicMath BasicMath -- BasicMath) {
|
|
over over * swap dup * + // (a * b) + (b * b)
|
|
} ::weird_math fn
|
|
|
|
3 4 weird_math // => 28
|
|
```
|
|
|
|
#### G.4.3 Mathematical Functions Usage
|
|
|
|
```
|
|
// Square root
|
|
16 sqrt print // => 4.0
|
|
2.0 sqrt print // => ~1.414
|
|
|
|
// Trigonometric functions
|
|
0.0 sin print // => 0.0
|
|
0.0 cos print // => 1.0
|
|
1.0 atan print // => ~0.7854
|
|
|
|
// Rounding functions
|
|
3.14 floor print // => 3.0
|
|
3.14 ceil print // => 4.0
|
|
3.7 round print // => 4.0
|
|
|
|
// Min/max
|
|
3 5 min print // => 3
|
|
3 5 max print // => 5
|
|
|
|
// Absolute value
|
|
-42 abs print // => 42
|
|
|
|
// Random numbers
|
|
rand print // => 0.7234... (random)
|
|
12345 seed // Seed for deterministic results
|
|
rand print // => 0.4321... (deterministic after seed)
|
|
```
|
|
|
|
#### G.4.4 Factorial
|
|
|
|
```
|
|
(Number -- Number) {
|
|
dup 1 <=
|
|
{ drop 1 } // Base case: 0! = 1! = 1
|
|
{ dup 1 - factorial * } // Recursive case: n! = n * (n-1)!
|
|
if
|
|
} ::factorial fn
|
|
|
|
5 factorial print // => 120
|
|
10 factorial print // => 3628800
|
|
|
|
// Iterative version (more efficient)
|
|
(Number -- Number) {
|
|
1 swap // Start with accumulator = 1
|
|
1 swap // Start counter at 1
|
|
{ // While counter <= n
|
|
dup 3 pick <=
|
|
}
|
|
{ // Body: multiply accumulator by counter
|
|
2 pick over * // acc * counter
|
|
3 roll drop // Drop old accumulator
|
|
swap 1 + swap // Increment counter
|
|
}
|
|
while
|
|
drop // Drop counter
|
|
swap drop // Drop original n
|
|
} ::factorial_iter fn
|
|
|
|
5 factorial_iter print // => 120
|
|
```
|
|
|
|
#### G.4.5 FizzBuzz
|
|
|
|
```
|
|
(Number -- ) {
|
|
dup 15 % 0 ==
|
|
{ drop "FizzBuzz" print }
|
|
{
|
|
dup 3 % 0 ==
|
|
{ drop "Fizz" print }
|
|
{
|
|
dup 5 % 0 ==
|
|
{ drop "Buzz" print }
|
|
{ print }
|
|
if
|
|
}
|
|
if
|
|
}
|
|
if
|
|
} ::fizzbuzz fn
|
|
|
|
// Print FizzBuzz for 1 to 100
|
|
1 100 { fizzbuzz } for
|
|
```
|
|
|
|
#### G.4.6 Using Roll
|
|
|
|
```
|
|
// Roll rotates the top n items, times times
|
|
// Stack: 1 2 3 4 5
|
|
|
|
// Rotate top 3 items once
|
|
3 1 roll // Stack: 1 2 4 5 3
|
|
|
|
// Start fresh: 1 2 3 4 5
|
|
// Rotate top 3 items twice
|
|
3 2 roll // Stack: 1 2 5 3 4
|
|
|
|
// Start fresh: 1 2 3 4 5
|
|
// Rotate all 5 items once
|
|
5 1 roll // Stack: 2 3 4 5 1
|
|
|
|
// Start fresh: 1 2 3 4 5
|
|
// Rotate top 4 items three times
|
|
4 3 roll // Stack: 1 4 5 2 3
|
|
|
|
// Practical use: bring nth item to top
|
|
// Stack: a b c d e
|
|
// Want to bring 'b' (index 3) to top
|
|
4 3 roll // Rotates top 4 three times: a c d e b
|
|
|
|
// Or use pick for non-destructive copy
|
|
// Stack: a b c d e
|
|
3 pick // Stack: a b c d e b (copied from index 3)
|
|
```
|
|
|
|
#### G.4.7 Array Processing
|
|
|
|
```
|
|
// Sum of squares of even numbers from 1 to 10
|
|
[1 2 3 4 5 6 7 8 9 10]
|
|
{ 2 % 0 == } filter // Keep even: [2 4 6 8 10]
|
|
{ dup * } map // Square each: [4 16 36 64 100]
|
|
0 { + } reduce // Sum: 220
|
|
print
|
|
|
|
// Find maximum in array
|
|
[5 2 9 1 7 6]
|
|
dup 0 at // Start with first element
|
|
{
|
|
over over >
|
|
{ swap } // If current > max, swap
|
|
{ } // Otherwise keep max
|
|
if
|
|
drop // Drop the smaller value
|
|
} reduce
|
|
print // => 9
|
|
|
|
// Average of array
|
|
[10 20 30 40 50]
|
|
dup 0 { + } reduce // Sum: 150
|
|
swap length // Length: 5
|
|
/ // Average: 30
|
|
print
|
|
|
|
// Or use built-in functions
|
|
[10 20 30 40 50] mean print // => 30.0
|
|
[1 2 3 4 5] sum print // => 15
|
|
|
|
// Zip and enumerate
|
|
[1 2 3] [4 5 6] zip print // => [[1 4] [2 5] [3 6]]
|
|
["a" "b" "c"] enumerate print // => [[0 "a"] [1 "b"] [2 "c"]]
|
|
```
|
|
|
|
#### G.4.8 String Operations
|
|
|
|
```
|
|
// String manipulation
|
|
"hello" " world" concat print // => "hello world"
|
|
"hello" 1 3 substr print // => "el"
|
|
"a,b,c" "," split print // => ["a" "b" "c"]
|
|
["a" "b" "c"] "," join print // => "a,b,c"
|
|
|
|
// String searching
|
|
"hello world" "world" find // => Option::Some(6)
|
|
"hello" "hel" starts_with print // => true
|
|
"hello" "lo" ends_with print // => true
|
|
|
|
// String modification
|
|
"hello world" "world" "Stack" replace print // => "hello Stack"
|
|
" hello " trim print // => "hello"
|
|
|
|
// String formatting
|
|
"x=%d, y=%d" [5 10] format print // => "x=5, y=10"
|
|
"Name: %s, Age: %d" ["Alice" 30] format print // => "Name: Alice, Age: 30"
|
|
```
|
|
|
|
#### G.4.9 Reflection Examples
|
|
|
|
```
|
|
// Type checking
|
|
(Self -- ) {
|
|
dup type_of to_str "Type: " swap concat print
|
|
|
|
dup ::Addable implements
|
|
{ "Supports addition" print }
|
|
{ "Does not support addition" print }
|
|
if
|
|
|
|
dup ::Stringifiable implements
|
|
{ to_str print }
|
|
{ drop "Cannot convert to string" print }
|
|
if
|
|
} ::debug_print fn
|
|
|
|
42 debug_print
|
|
// Output:
|
|
// Type: i64
|
|
// Supports addition
|
|
// 42
|
|
|
|
// Dynamic dispatch based on traits
|
|
(Self -- ) {
|
|
dup ::Drawable implements
|
|
{ draw }
|
|
{ drop "Not drawable" print }
|
|
if
|
|
} ::try_draw fn
|
|
|
|
// Generic type information
|
|
(Self -- String) {
|
|
type_of to_str
|
|
} ::type_name fn
|
|
|
|
42 type_name print // => "i64"
|
|
"hello" type_name print // => "String"
|
|
[1 2 3] type_name print // => "Array<i64>"
|
|
```
|
|
|
|
#### G.4.10 Testing Examples
|
|
|
|
```
|
|
// Simple assertions
|
|
{ 2 3 + } { 5 == } assert
|
|
{ 5 square } { 25 == } assert
|
|
|
|
// Testing a function thoroughly
|
|
(Number -- Number) { dup * } ::square fn
|
|
|
|
// Test with multiple values
|
|
{ 0 square } { 0 == } assert
|
|
{ 1 square } { 1 == } assert
|
|
{ 5 square } { 25 == } assert
|
|
{ -3 square } { 9 == } assert
|
|
|
|
// Testing edge cases
|
|
(Number Number -- Number) { / } ::divide fn
|
|
|
|
// This will pass
|
|
{ 10 2 divide } { 5 == } assert
|
|
|
|
// This will halt (division by zero should be handled)
|
|
// { 10 0 divide } { ... } assert // Don't do this!
|
|
|
|
// Testing string operations
|
|
{ "hello" " world" concat } { "hello world" == } assert
|
|
{ "hello" length } { 5 == } assert
|
|
{ "hello" 1 3 substr } { "el" == } assert
|
|
```
|
|
|
|
#### G.4.11 Constants Example
|
|
|
|
```
|
|
// Define mathematical constants
|
|
3.1415926535 ::pi const
|
|
2.7182818284 ::e const
|
|
1.6180339887 ::phi const
|
|
|
|
// Use in calculations
|
|
(Number -- Number) {
|
|
dup * pi * // Area = r² * π
|
|
} ::circle_area fn
|
|
|
|
5 circle_area print // => ~78.54
|
|
|
|
// Physical constants
|
|
299792458 ::speed_of_light const // m/s
|
|
9.81 ::gravity const // m/s²
|
|
|
|
// Use in physics calculations
|
|
(Number -- Number) {
|
|
dup * 2 / gravity * // E = mgh where h = v²/2g
|
|
} ::kinetic_to_potential fn
|
|
|
|
10 kinetic_to_potential print // => ~490.5
|
|
```
|
|
|
|
---
|
|
|
|
## Appendix H: Complete Type Reference
|
|
|
|
This appendix provides detailed information about all types in the language, organized alphabetically.
|
|
|
|
### Primitive Types
|
|
|
|
#### bool
|
|
**Description**: Boolean value representing true or false.
|
|
**Size**: 1 byte
|
|
**Values**: `true`, `false`
|
|
**Default**: `false`
|
|
**Traits Implemented**: Stackable, Equatable, Logical, Stringifiable
|
|
**Conversions**: to_str
|
|
**Example**:
|
|
```
|
|
true
|
|
false
|
|
5 3 > // => true
|
|
```
|
|
|
|
#### char
|
|
**Description**: Single UTF-8 character.
|
|
**Size**: 4 bytes (Unicode code point)
|
|
**Values**: Any valid Unicode character
|
|
**Literals**: `'A'`, `'\n'`, `'\u{1F600}'`
|
|
**Traits Implemented**: Stackable, Equatable, Orderable, Comparable, Stringifiable
|
|
**Conversions**: to_str
|
|
**Example**:
|
|
```
|
|
'A'
|
|
'😀'
|
|
'\n'
|
|
```
|
|
|
|
#### f32
|
|
**Description**: 32-bit floating point number (IEEE 754 single precision).
|
|
**Size**: 4 bytes
|
|
**Range**: ±1.18e-38 to ±3.40e+38
|
|
**Precision**: ~7 decimal digits
|
|
**Default**: `0.0`
|
|
**Traits Implemented**: Stackable, Addable, Multiplyable, Exponentiable, Logarithmic, Math, Orderable, Equatable, Comparable, Number, Convertible, Stringifiable, Parseable
|
|
**Conversions**: to_i8, to_i16, to_i32, to_i64, to_u8, to_u16, to_u32, to_u64, to_f64, to_str
|
|
**Overflow Behavior**: IEEE 754 (infinity/NaN)
|
|
**Example**:
|
|
```
|
|
3.14:f32
|
|
1.0:f32 2.0:f32 +
|
|
```
|
|
|
|
#### f64
|
|
**Description**: 64-bit floating point number (IEEE 754 double precision).
|
|
**Size**: 8 bytes
|
|
**Range**: ±2.23e-308 to ±1.80e+308
|
|
**Precision**: ~15 decimal digits
|
|
**Default**: `0.0` (default float type)
|
|
**Traits Implemented**: Stackable, Addable, Multiplyable, Exponentiable, Logarithmic, Math, Orderable, Equatable, Comparable, Number, Convertible, Stringifiable, Parseable
|
|
**Conversions**: to_i8, to_i16, to_i32, to_i64, to_u8, to_u16, to_u32, to_u64, to_f32, to_str
|
|
**Overflow Behavior**: IEEE 754 (infinity/NaN)
|
|
**Example**:
|
|
```
|
|
3.14
|
|
1.0 2.0 +
|
|
```
|
|
|
|
#### i8
|
|
**Description**: 8-bit signed integer.
|
|
**Size**: 1 byte
|
|
**Range**: -128 to 127
|
|
**Default**: `0`
|
|
**Traits Implemented**: Stackable, Addable, Multiplyable, Exponentiable, Logarithmic, Math, Orderable, Equatable, Comparable, Bitwise, Number, Size, Convertible, Stringifiable, Parseable
|
|
**Conversions**: to_i16, to_i32, to_i64, to_u8, to_u16, to_u32, to_u64, to_f32, to_f64, to_str
|
|
**Overflow Behavior**: Wrapping
|
|
**Example**:
|
|
```
|
|
42:i8
|
|
127:i8 1:i8 + // => -128 (wraps)
|
|
```
|
|
|
|
#### i16
|
|
**Description**: 16-bit signed integer.
|
|
**Size**: 2 bytes
|
|
**Range**: -32,768 to 32,767
|
|
**Default**: `0`
|
|
**Traits Implemented**: Stackable, Addable, Multiplyable, Exponentiable, Logarithmic, Math, Orderable, Equatable, Comparable, Bitwise, Number, Size, Convertible, Stringifiable, Parseable
|
|
**Conversions**: to_i8, to_i32, to_i64, to_u8, to_u16, to_u32, to_u64, to_f32, to_f64, to_str
|
|
**Overflow Behavior**: Wrapping
|
|
**Example**:
|
|
```
|
|
1000:i16
|
|
```
|
|
|
|
#### i32
|
|
**Description**: 32-bit signed integer.
|
|
**Size**: 4 bytes
|
|
**Range**: -2,147,483,648 to 2,147,483,647
|
|
**Default**: `0`
|
|
**Traits Implemented**: Stackable, Addable, Multiplyable, Exponentiable, Logarithmic, Math, Orderable, Equatable, Comparable, Bitwise, Number, Size, Convertible, Stringifiable, Parseable
|
|
**Conversions**: to_i8, to_i16, to_i64, to_u8, to_u16, to_u32, to_u64, to_f32, to_f64, to_str
|
|
**Overflow Behavior**: Wrapping
|
|
**Example**:
|
|
```
|
|
1000000:i32
|
|
```
|
|
|
|
#### i64
|
|
**Description**: 64-bit signed integer.
|
|
**Size**: 8 bytes
|
|
**Range**: -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
|
|
**Default**: `0` (default integer type)
|
|
**Traits Implemented**: Stackable, Addable, Multiplyable, Exponentiable, Logarithmic, Math, Orderable, Equatable, Comparable, Bitwise, Number, Size, Convertible, Stringifiable, Parseable
|
|
**Conversions**: to_i8, to_i16, to_i32, to_u8, to_u16, to_u32, to_u64, to_f32, to_f64, to_str
|
|
**Overflow Behavior**: Wrapping
|
|
**Example**:
|
|
```
|
|
42
|
|
1000000000
|
|
```
|
|
|
|
#### u8
|
|
**Description**: 8-bit unsigned integer.
|
|
**Size**: 1 byte
|
|
**Range**: 0 to 255
|
|
**Default**: `0`
|
|
**Traits Implemented**: Stackable, Addable, Multiplyable, Exponentiable, Logarithmic, Math, Orderable, Equatable, Comparable, Bitwise, Number, Size, Convertible, Stringifiable, Parseable
|
|
**Conversions**: to_i8, to_i16, to_i32, to_i64, to_u16, to_u32, to_u64, to_f32, to_f64, to_str
|
|
**Overflow Behavior**: Wrapping
|
|
**Example**:
|
|
```
|
|
255:u8
|
|
```
|
|
|
|
#### u16
|
|
**Description**: 16-bit unsigned integer.
|
|
**Size**: 2 bytes
|
|
**Range**: 0 to 65,535
|
|
**Default**: `0`
|
|
**Traits Implemented**: Stackable, Addable, Multiplyable, Exponentiable, Logarithmic, Math, Orderable, Equatable, Comparable, Bitwise, Number, Size, Convertible, Stringifiable, Parseable
|
|
**Conversions**: to_i8, to_i16, to_i32, to_i64, to_u8, to_u32, to_u64, to_f32, to_f64, to_str
|
|
**Overflow Behavior**: Wrapping
|
|
**Example**:
|
|
```
|
|
65535:u16
|
|
```
|
|
|
|
#### u32
|
|
**Description**: 32-bit unsigned integer.
|
|
**Size**: 4 bytes
|
|
**Range**: 0 to 4,294,967,295
|
|
**Default**: `0`
|
|
**Traits Implemented**: Stackable, Addable, Multiplyable, Exponentiable, Logarithmic, Math, Orderable, Equatable, Comparable, Bitwise, Number, Size, Convertible, Stringifiable, Parseable
|
|
**Conversions**: to_i8, to_i16, to_i32, to_i64, to_u8, to_u16, to_u64, to_f32, to_f64, to_str
|
|
**Overflow Behavior**: Wrapping
|
|
**Example**:
|
|
```
|
|
4000000000:u32
|
|
```
|
|
|
|
#### u64
|
|
**Description**: 64-bit unsigned integer.
|
|
**Size**: 8 bytes
|
|
**Range**: 0 to 18,446,744,073,709,551,615
|
|
**Default**: `0`
|
|
**Traits Implemented**: Stackable, Addable, Multiplyable, Exponentiable, Logarithmic, Math, Orderable, Equatable, Comparable, Bitwise, Number, Size, Convertible, Stringifiable, Parseable
|
|
**Conversions**: to_i8, to_i16, to_i32, to_i64, to_u8, to_u16, to_u32, to_f32, to_f64, to_str
|
|
**Overflow Behavior**: Wrapping
|
|
**Example**:
|
|
```
|
|
18000000000000000000:u64
|
|
```
|
|
|
|
### Composite Types
|
|
|
|
#### Array<T>
|
|
**Description**: Homogeneous collection of values of type T.
|
|
**Size**: Variable (depends on length and element type)
|
|
**Syntax**: `[elements]` or `[elements :type]`
|
|
**Traits Implemented**: Stackable, ArrayOf<T>, Sized, Selectable<T>, Sliceable, Iterable<T>, Concatenable, Equatable, Stringifiable
|
|
**Operations**: at, slice, length, map, filter, reduce, each, foldl, foldr, concat, reverse, transpose, window, zip, enumerate, sum, mean
|
|
**Example**:
|
|
```
|
|
[1 2 3 4 5]
|
|
[1.0 2.0 3.0 :f32]
|
|
[[1 2] [3 4]]
|
|
```
|
|
|
|
#### String
|
|
**Description**: UTF-8 encoded string of characters.
|
|
**Size**: Variable
|
|
**Syntax**: `"text"`
|
|
**Traits Implemented**: Stackable, String, Sized, Sliceable, Concatenable, Iterable<char>, Orderable, Equatable, Comparable, Stringifiable, Parseable
|
|
**Operations**: length, concat, substr, split, join, replace, trim, find, starts_with, ends_with, format
|
|
**Example**:
|
|
```
|
|
"hello world"
|
|
"hello" " world" concat
|
|
```
|
|
|
|
#### Struct
|
|
**Description**: User-defined composite type with named fields.
|
|
**Size**: Sum of field sizes
|
|
**Syntax**: `(field_types --) { field_names: } ::Name<T>? struct`
|
|
**Traits Implemented**: Stackable, Equatable (if fields are), Stringifiable (if fields are)
|
|
**Operations**: get, set (field access)
|
|
**Example**:
|
|
```
|
|
(Number Number --) { x: y: } ::Point struct
|
|
3.0 4.0 Point
|
|
point ::x get
|
|
```
|
|
|
|
#### Union
|
|
**Description**: Tagged union with multiple possible variant types.
|
|
**Size**: Size of largest variant plus tag
|
|
**Syntax**: `(variant_types --) { variants } ::Name<T>? union`
|
|
**Traits Implemented**: Stackable, Equatable (if variants are), Stringifiable (if variants are)
|
|
**Operations**: Pattern matching with match
|
|
**Example**:
|
|
```
|
|
(T --) { Some(T) None } ::Option<T> union
|
|
42 Option::Some
|
|
Option::None
|
|
```
|
|
|
|
#### Enum
|
|
**Description**: Fixed set of named integer values.
|
|
**Size**: Size of underlying integer type (typically i64)
|
|
**Syntax**: `{ variants } ::Name enum`
|
|
**Traits Implemented**: Stackable, Equatable, Orderable, Comparable, Convertible, Stringifiable
|
|
**Operations**: Pattern matching, comparison
|
|
**Example**:
|
|
```
|
|
{ Pending: Active: Complete: } ::Status enum
|
|
Status::Active
|
|
```
|
|
|
|
### Standard Generic Types
|
|
|
|
#### Option<T>
|
|
**Description**: Represents an optional value - either Some(T) or None.
|
|
**Definition**: `(T --) { Some(T) None } ::Option<T> union`
|
|
**Use Cases**: Nullable values, error handling, optional parameters
|
|
**Traits Implemented**: Stackable, Logical (None is falsy), Equatable, Stringifiable
|
|
**Example**:
|
|
```
|
|
42 Option::Some
|
|
Option::None
|
|
|
|
opt {
|
|
Some(x) => { x print }
|
|
None => { "Nothing" print }
|
|
} match
|
|
```
|
|
|
|
#### Result<T E>
|
|
**Description**: Represents success (Ok) or failure (Err) with values.
|
|
**Definition**: `(T E --) { Ok(T) Err(E) } ::Result<T E> union`
|
|
**Use Cases**: Error handling with details, operations that can fail
|
|
**Traits Implemented**: Stackable, Logical (Err is falsy), Equatable, Stringifiable
|
|
**Example**:
|
|
```
|
|
"success" Result::Ok
|
|
"error message" Result::Err
|
|
|
|
result {
|
|
Ok(val) => { val process }
|
|
Err(e) => { e "Error: " swap concat print }
|
|
} match
|
|
```
|
|
|
|
### Special Types
|
|
|
|
#### Identifier
|
|
**Description**: Represents an identifier literal (name pushed as value).
|
|
**Syntax**: `::name`
|
|
**Traits Implemented**: Identifier, Stackable, Equatable, Stringifiable
|
|
**Use Cases**: Struct/trait definitions, field access, meta-programming
|
|
**Example**:
|
|
```
|
|
::Point
|
|
::Addable
|
|
point ::x get
|
|
```
|
|
|
|
#### TokenString
|
|
**Description**: Unparsed code block enclosed in braces.
|
|
**Syntax**: `{ code }`
|
|
**Traits Implemented**: Implementable
|
|
**Use Cases**: Function bodies, control flow blocks, lambda expressions
|
|
**Example**:
|
|
```
|
|
{ dup * }
|
|
{ 2 3 + } eval
|
|
```
|
|
|
|
#### Callable
|
|
**Description**: Executable code block created by lambda operator.
|
|
**Created By**: `lambda` operator
|
|
**Traits Implemented**: Stackable
|
|
**Use Cases**: First-class functions, higher-order operations
|
|
**Example**:
|
|
```
|
|
{ dup * } lambda ::square swap
|
|
5 square eval // => 25
|
|
```
|
|
|
|
--- |