Collections
Arrays and hashes - Soli's primary collection types with powerful built-in methods.
Arrays
Array
Ordered, mutable collection of elements.
// Creating arrays
let numbers = [1, 2, 3, 4, 5];
let names = ["Alice", "Bob", "Charlie"];
// Type-annotated arrays
let scores: Int[] = [95, 87, 92, 88, 90];
// Array from range
let range_arr = range(1, 10); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
let step_arr = range(0, 10, 2); // [0, 2, 4, 6, 8]
// Access elements
print(numbers[0]); // 1
print(numbers[-1]); // 5 (last element)
// Modify elements
numbers[0] = 10;
Array Methods
.map(fn)
Transform each element using a function.
let numbers = [1, 2, 3, 4, 5];
let doubled = numbers.map(fn(x) x * 2);
print(doubled); // [2, 4, 6, 8, 10]
.filter(fn)
Keep elements matching a condition.
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let evens = numbers.filter(fn(x) x % 2 == 0);
print(evens); // [2, 4, 6, 8, 10]
.reduce(fn, initial)
Accumulate to a single value.
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let sum = numbers.reduce(fn(acc, x) acc + x, 0); // 55
.each(fn)
Iterate with side effects.
let numbers = [1, 2, 3];
numbers.each(fn(x) print(x)); // Prints each number
.find(fn) / .every(fn) / .some(fn)
Search and check array elements.
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// find - first matching element
let first_even = numbers.find(fn(x) x % 2 == 0); // 2
// every - check if all elements match
let all_positive = numbers.every(fn(x) x > 0); // true
// some - check if any element matches
let has_large = numbers.some(fn(x) x > 8); // true
Method Chaining
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// Chaining methods
let result = numbers
.filter(fn(x) x % 2 == 0) // [2, 4, 6, 8, 10]
.map(fn(x) x * x) // [4, 16, 36, 64, 100]
.filter(fn(x) x < 50); // [4, 16, 36]
print(result); // [4, 16, 36]
Hashes
Hash
Key-value collection (dictionary/map).
// Creating hashes
let person = {
"name": "Alice",
"age": 30,
"city": "New York"
};
// Alternative syntax with =>
let scores = {"Alice" => 95, "Bob" => 87, "Charlie" => 92};
// Nested hashes
let user = {
"id": 1,
"profile": {
"name": "Alice",
"email": "[email protected]"
}
};
// Access values
print(person["name"]); // "Alice"
print(person["age"]); // 30
print(person["email"]); // null (key doesn't exist)
// Modify values
person["age"] = 31;
person["country"] = "France"; // Add new key
Hash Methods
let scores = {"Alice": 90, "Bob": 85, "Charlie": 95, "Diana": 88};
// Get length
print(len(scores)); // 4
// Get all keys
let keys_list = keys(scores); // ["Alice", "Bob", "Charlie", "Diana"]
// Get all values
let values_list = values(scores); // [90, 85, 95, 88]
// Check if key exists
print(has_key(scores, "Alice")); // true
print(has_key(scores, "Eve")); // false
// Get entries as [key, value] pairs
let entries_list = entries(scores);
// [["Alice", 90], ["Bob", 85], ["Charlie", 95], ["Diana", 88]]
// Merge hashes
let defaults = {"Alice": 0, "Bob": 0};
let merged = merge(scores, defaults);
// map - transform entries
let curved = scores.map(fn(pair) {
let name = pair[0];
let score = pair[1];
return [name, score + 5];
});
print(curved); // {Alice: 95, Bob: 90, Charlie: 100, Diana: 93}
// filter - keep entries matching condition
let high_scores = scores.filter(fn(pair) {
return pair[1] >= 90;
});
print(high_scores); // {Alice: 90, Charlie: 95}