OxL Справочник OxL
РусскийEnglish

V.2 Типы, ошибки, итераторы

Утилита, считающая слова в файле.

oxl✓ проверяется в CI
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