V.2 Типы, ошибки, итераторы
Утилита, считающая слова в файле.
use std.io { File }
use std.os { args }
const TOP_N = 10 // именованная константа вместо «магического» числа
@error data Usage { msg: str } // @error: тип-ошибка, его нельзя проигнорировать
// pure — функция без эффектов: не ходит в сеть, не читает файлы
fn countWords(text: str) -> Map<str, u64> pure {
var counts: Map<str, u64> = {:} // {:} — пустой словарь, {} — пустой блок
for w in text.splitWhitespace() where w.len() > 2 { // where — фильтр прямо в цикле
counts[w.lower()] = (counts.get(w.lower()) ?? 0) + 1
}
counts // последнее выражение блока — результат функции
}
// Результат — либо (), либо одна из ошибок: Usage или IoError
fn main() -> () | Usage | IoError io {
// нет аргумента — fail сразу возвращает ошибку из main
let path = args().get(1) ?? fail Usage{ msg: "usage: wc <file>" }
let text = File.readText(path)? // ? пробрасывает IoError наверх
// Выражение запроса в памяти: ленивый iter<str>
let top = from (w, n) in countWords(text) order by n desc take TOP_N select "{w}: {n}"
for line in top { print(line) }
}Исходник: docs/spec/oxl-standard.md