Built-in Types Reference
This page provides comprehensive reference information for all built-in types in the Y programming language, including their properties, memory layout, valid operations, and usage patterns.
Primitive Types
Integer Types
i64 - 64-bit Signed Integer
- Size: 8 bytes (64 bits)
- Range: -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
- Default numeric type: Most integer literals default to
i64
let count: i64 = 42;
let negative: i64 = -1000;
let max_value: i64 = 9223372036854775807;
Operations:
- Arithmetic:
+,-,*,/ - Comparison:
==,!=,<,>,<=,>= - Assignment:
=
u32 - 32-bit Unsigned Integer
- Size: 4 bytes (32 bits)
- Range: 0 to 4,294,967,295
- Use case: When you need a smaller integer type or explicitly unsigned values
let port: u32 = 8080;
let size: u32 = 1024;
let max_u32: u32 = 4294967295;
Operations:
- Arithmetic:
+,-,*,/ - Comparison:
==,!=,<,>,<=,>= - Assignment:
=
Floating Point Types
f64 - 64-bit Floating Point
- Size: 8 bytes (64 bits)
- Range: ±1.7976931348623157E+308 (IEEE 754 double precision)
- Precision: ~15-17 decimal digits
- Default floating type: Floating literals default to
f64
let pi: f64 = 3.14159265358979;
let price: f64 = 99.99;
let scientific: f64 = 1.23e-4; // 0.000123
Operations:
- Arithmetic:
+,-,*,/ - Comparison:
==,!=,<,>,<=,>= - Assignment:
=
Special Values:
- Positive infinity
- Negative infinity
- NaN (Not a Number)
Boolean Type
bool - Boolean
- Size: 1 byte
- Values:
trueorfalse - Use case: Logical operations, conditions, flags
let is_ready: bool = true;
let debug_mode: bool = false;
let result: bool = x > 0;
Operations:
- Logical:
&&,||,!(conceptual - may not be fully implemented) - Comparison:
==,!= - Assignment:
=
Character Types
char - Unicode Character
- Size: Variable (1-4 bytes UTF-8)
- Range: Any valid Unicode code point
- Use case: Single characters, text processing
let letter: char = 'a';
let digit: char = '5';
let unicode: char = '🚀';
let escape: char = '\n';
Operations:
- Comparison:
==,!=,<,>,<=,>= - Assignment:
=
Escape Sequences:
\n- Newline\t- Tab\\- Backslash\'- Single quote\"- Double quote
str - String Slice
- Size: Variable (UTF-8 encoded)
- Properties: Immutable sequence of characters
- Use case: Text data, string literals
let greeting: str = "Hello, World!";
let empty: str = "";
let multiline: str = "Line 1\nLine 2";
Operations:
- Comparison:
==,!=,<,>,<=,>=(lexicographic) - Assignment:
= - Property access:
.len()(when available)
Composite Types
Array Types
&[T] - Array Reference
- Size: Pointer to data + length information
- Properties: Reference to a contiguous sequence of elements of type
T - Mutability: Elements can be modified if array is mutable
let numbers: &[i64] = &[1, 2, 3, 4, 5];
let empty: &[str] = &[];
let mut mutable_array: &[i64] = &[10, 20, 30];
Operations:
- Indexing:
array[index] - Assignment (to elements):
array[index] = value - Property access:
.length()(conceptual)
Memory Layout:
&[i64] -> [pointer to data][length]
|
v
[elem0][elem1][elem2]...
Function Types
(ParamTypes) -> ReturnType - Function Type
- Size: Pointer size (8 bytes on 64-bit systems)
- Properties: Reference to executable code
- Use case: Function parameters, callbacks, stored procedures
// Function taking no parameters, returning i64
let getter: () -> i64 = get_value;
// Function taking two i64s, returning i64
let binary_op: (i64, i64) -> i64 = add;
// Function taking a function, returning i64
let higher_order: ((i64) -> i64) -> i64 = apply_twice;
Operations:
- Function call:
function(arguments) - Assignment:
= - Comparison:
==,!=(identity comparison)
Special Types
void - No Value
- Size: 0 bytes
- Use case: Functions that don't return a value
- Note: Cannot be stored in variables, only used as return type
fn print_message(msg: str): void {
printf(msg);
// No return value
}
Type Conversion and Compatibility
Implicit Conversions
Y has no implicit type conversions. All type conversions must be explicit.
let int_val: i64 = 42;
let uint_val: u32 = 100;
// This would be an error:
// let result = int_val + uint_val; // Error: type mismatch
// Explicit conversion required (conceptual):
// let result = int_val + to_i64(uint_val);
Type Compatibility Rules
- Exact match required: Variables must match their declared types exactly
- No automatic promotion:
u32doesn't automatically becomei64 - No automatic widening:
f32(if it existed) wouldn't becomef64
Memory Layout and Alignment
Primitive Type Sizes
| Type | Size (bytes) | Alignment (bytes) |
|---|---|---|
i64 | 8 | 8 |
u32 | 4 | 4 |
f64 | 8 | 8 |
bool | 1 | 1 |
char | 1-4 | 1 |
str | Variable | 1 |
Array Memory Layout
let array: &[i64] = &[1, 2, 3];
Memory layout:
array variable: [data_ptr: 8 bytes][length: 8 bytes]
|
v
heap/stack data: [1: 8 bytes][2: 8 bytes][3: 8 bytes]
Struct Memory Layout
struct Example {
flag: bool; // 1 byte
count: i64; // 8 bytes (may have 7 bytes padding before)
value: f64; // 8 bytes
}
Memory layout (with alignment):
[flag: 1 byte][padding: 7 bytes][count: 8 bytes][value: 8 bytes]
Total size: 24 bytes
Type Usage Patterns
Choosing Numeric Types
// Use i64 for general integer values
let age: i64 = 25;
let count: i64 = 1000;
// Use u32 for specific cases requiring unsigned values
let port: u32 = 8080;
let size: u32 = 1024;
// Use f64 for floating point calculations
let price: f64 = 99.99;
let percentage: f64 = 0.15;
Working with Strings and Characters
// String literals for text data
let message: str = "Hello, World!";
let filename: str = "data.txt";
// Characters for individual character processing
let separator: char = ',';
let newline: char = '\n';
// Arrays of characters for mutable text processing
let mut buffer: &[char] = &['H', 'e', 'l', 'l', 'o'];
Function Type Patterns
// Simple callback
let callback: () -> void = cleanup;
// Data processor
let processor: (str) -> str = normalize_text;
// Predicate function
let validator: (i64) -> bool = is_valid_age;
// Higher-order function
let mapper: (&[i64], (i64) -> i64) -> &[i64] = transform_array;
Type Limits and Constraints
Integer Overflow
Y's integer types have defined overflow behavior (implementation-dependent):
let max_i64: i64 = 9223372036854775807;
// let overflow = max_i64 + 1; // Behavior depends on implementation
Floating Point Precision
let precise: f64 = 0.1 + 0.2; // May not exactly equal 0.3
let comparison: bool = precise == 0.3; // May be false due to precision
Array Bounds
let array: &[i64] = &[1, 2, 3];
let valid: i64 = array[0]; // Valid: index 0
let valid2: i64 = array[2]; // Valid: index 2
// let invalid = array[3]; // Runtime error: out of bounds
Best Practices
Type Selection
- Use
i64for general-purpose integers - Use
u32only when you specifically need unsigned semantics - Use
f64for all floating-point calculations - Use
boolfor true/false values, not integers - Use
charfor individual characters,strfor text
Type Annotations
// Explicit when type isn't obvious
let empty_array: &[i64] = &[];
let function_var: (i64) -> bool = validator;
// Can be omitted when obvious
let count = 42; // Obviously i64
let name = "Alice"; // Obviously str
let ready = true; // Obviously bool
Safe Operations
// Check bounds before array access
fn safe_get(array: &[i64], index: i64): i64 {
if (index >= 0 && index < array.length()) {
return array[index];
} else {
return 0; // Or appropriate default/error handling
}
}
// Validate function parameters
fn safe_divide(a: f64, b: f64): f64 {
if (b != 0.0) {
return a / b;
} else {
return 0.0; // Or appropriate error handling
}
}